*** FATAL EXCEPTION IN SYSTEM PROCESS: main
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.NEW_OUTGOING_CALL flg=0x11000010 (has extras) } in com.android.server.location.injector.SystemEmergencyHelper$1@42d2813
at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$android-app-LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1800)
at android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at com.android.server.SystemServer.run(SystemServer.java:966)
at com.android.server.SystemServer.main(SystemServer.java:651)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.:)
at com.android.internal.os.ZygoteInit.(ZygoteInit.:)
Caused by: java.lang.IllegalStateException: telephony service is .
at android.telephony.TelephonyManager.(TelephonyManager.:)
at com.android.server.location.injector.SystemEmergencyHelper$.(SystemEmergencyHelper.:)
at android.app.LoadedApk$ReceiverDispatcher.lambda$getRunnable$-app-LoadedApk$ReceiverDispatcher(LoadedApk.java:)
... more
Caused by: java.lang.IllegalStateException: telephony service is null.
at android.telephony.TelephonyManager.isEmergencyNumber(TelephonyManager.java:14136)
at com.android.server.location.injector.SystemEmergencyHelper$1.onReceive(SystemEmergencyHelper.java:70)
at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$android-app-LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1790)
at android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at com.android.server.SystemServer.run(SystemServer.java:966)
at com.android.server.SystemServer.main(SystemServer.java:651)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:920)
2. Binder 同步通信时发生的异常
以下是剥离了时间、pid、tid 和 tag 后的输出:
FATAL EXCEPTION: main
PID: 3264
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.hashCode()' on a nullobject reference
at android.os.Parcel.createExceptionOrNull(Parcel.java:3017)
at android.os.Parcel.createException(Parcel.java:2995)
at android.os.Parcel.readException(Parcel.java:2978)
at android.os.Parcel.readException(Parcel.java:2920)
at android.app.IActivityManager$Stub$Proxy.attachApplication(IActivityManager.java:5148)
at android.app.ActivityThread.attach(ActivityThread.java:7644)
at android.app.ActivityThread.main(ActivityThread.java:7943)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.am.HostingRecord.getHostingTypeIdStatsd(HostingRecord.java:234)
at com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:5102)
at com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:5115)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2339)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2655)
android.os.RemoteException: Binder transaction failed
at android.os.Parcel.createExceptionOrNull(Parcel.java:3017)
at android.os.Parcel.createException(Parcel.java:2995)
at android.os.Parcel.readException(Parcel.java:2978)
at android.os.Parcel.readException(Parcel.java:2920)
at android.app.IActivityManager$Stub$Proxy.attachApplication(IActivityManager.java:5148)
at android.app.ActivityThread.attach(ActivityThread.java:7644)
at android.app.ActivityThread.main(ActivityThread.java:7943)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)
Caused by: java.lang.NullPointerException in remote process: Attempt to invoke virtual method 'int java.lang.String.hashCode()' on a nullobject reference
at com.android.server.am.HostingRecord.getHostingTypeIdStatsd(HostingRecord.java:234)
at com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:5102)
at com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:5115)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2339)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2655)
410 jboolean res = env->CallBooleanMethod(mObject, gBinderOffsets.mExecTransact,
411 code, reinterpret_cast<jlong>(&data), reinterpret_cast<jlong>(reply), flags);
412413if (env->ExceptionCheck()) {
414ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
415binder_report_exception(env, excep.get(),
416"*** Uncaught remote exception! "417"(Exceptions are not yet supported across processes.)");
418 res = JNI_FALSE;
419 }
*** Uncaughtremoteexception! (Exceptions are not yet supported across processes.)
java.lang.OutOfMemoryError: Failedtoallocatea280361534byteallocationwith25165820freebytesand258MBuntilOOM, targetfootprint29165820, growthlimit536870912atjava.util.Arrays.copyOf(Arrays.java:3136)
atjava.util.Arrays.copyOf(Arrays.java:3106)
atjava.util.ArrayList.grow(ArrayList.java:275)
atjava.util.ArrayList.ensureExplicitCapacity(ArrayList.java:249)
atjava.util.ArrayList.ensureCapacityInternal(ArrayList.java:241)
atjava.util.ArrayList.add(ArrayList.java:467)
atandroid.os.Parcel.readStringList(Parcel.java:3093)
atandroid.content.IntentFilter.<init>(IntentFilter.java:2377)
atandroid.content.IntentFilter$1.createFromParcel(IntentFilter.java:2269)
atandroid.content.IntentFilter$1.createFromParcel(IntentFilter.java:2267)
atandroid.app.IActivityManager$Stub.onTransact(IActivityManager.java:2241)
atcom.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2669)
atandroid.os.Binder.execTransactInternal(Binder.java:1221)
atandroid.os.Binder.execTransact(Binder.java:1163)
3. Binder 异步通信时发生的异常
对于普通的异步通信,Client 进程发送完后就不会再管了,所以 Server 端在收到通信后处理时发生的异常不会回传。最终所有的异常都会交由 JavaBBinder::onTransact 进行处理,处理的原则和上面一样:Exception 输出完后进程恢复,Error 则会导致进程退出。
不过有一类 Binder 异步通信的异常非常隐晦,如果不了解内部原理基本无法理解。示例如下:
FATAL EXCEPTION: Thread-3
Process: com.android.systemui, PID: 31695
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.bluetooth.device.action.BOND_STATE_CHANGED flg=0x10 (has extras) } in com.android.bluetooth.BluetoothManager$BluetoothBroadcastReceiver@c5b7352
at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$android-app-LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1920)
at android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:240)
at android.os.Looper.loop(Looper.java:351)
at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Looper android.os.HandlerThread.getLooper()' on a nullobject reference
at com.android.bluetooth.a2dp.A2dpService.getOrCreateStateMachine(A2dpService.java:2101)
at com.android.bluetooth.a2dp.A2dpService.connect(A2dpService.java:515)
at com.android.bluetooth.btservice.AdapterService.connectEnabledProfiles(AdapterService.java:1548)
at com.android.bluetooth.btservice.AdapterService.connectAllEnabledProfiles(AdapterService.java:4962)
at com.android.bluetooth.btservice.AdapterService$AdapterServiceBinder.connectAllEnabledProfiles(AdapterService.java:3076)
at com.android.bluetooth.btservice.AdapterService$AdapterServiceBinder.connectAllEnabledProfiles(AdapterService.java:3057)
at android.bluetooth.IBluetooth$Stub.onTransact(IBluetooth.java:1750)
at android.os.Binder.execTransactInternal(Binder.java:1331)
at android.os.Binder.execTransact(Binder.java:1268)
public T getValue(T defaultValue) {
if (mException != null) {
throw mException;
}
if (mObject == null) {
return defaultValue;
}
return mObject;
}
至此我们可以知道,上述调用栈中的 caused by 部分(截取如下)其实是 Binder 异步通信后对端进程(com.android.bluetooth)发生的异常。而整个调用栈中没有任何的 remote 字样,所以非常容易让人误以为是 systemui 进程中发生的异常。大家以后碰到这种调用栈时,一定要小心。
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Looper android.os.HandlerThread.getLooper()' on a nullobject reference
at com.android.bluetooth.a2dp.A2dpService.getOrCreateStateMachine(A2dpService.java:2101)
at com.android.bluetooth.a2dp.A2dpService.connect(A2dpService.java:515)
at com.android.bluetooth.btservice.AdapterService.connectEnabledProfiles(AdapterService.java:1548)
at com.android.bluetooth.btservice.AdapterService.connectAllEnabledProfiles(AdapterService.java:4962)
at com.android.bluetooth.btservice.AdapterService$AdapterServiceBinder.connectAllEnabledProfiles(AdapterService.java:3076)
at com.android.bluetooth.btservice.AdapterService$AdapterServiceBinder.connectAllEnabledProfiles(AdapterService.java:3057)
at android.bluetooth.IBluetooth$Stub.onTransact(IBluetooth.java:1750)
at android.os.Binder.execTransactInternal(Binder.java:1331)
at android.os.Binder.execTransact(Binder.java:1268)