01-31 09:27:54.801 9805 11368 D testtest: at xx.xx.xx.xx.HttpServer.lambda$vSE0qxyqGQt4NJp3RjyeRZx9JR8(Unknown Source:0) ... 01-31 09:27:54.801 9805 11368 D testtest: at xx.xx.xx.xx.xx.BinderEventHelper$1.onEvent(BinderEventHelper.java:53) 01-31 09:27:54.801 9805 11368 D testtest: at xx.xx.xx.xx.binder.aidl.IEventListener$Stub.onTransact(IEventListener.java:63) 01-31 09:27:54.801 9805 11368 D testtest: at android.os.Binder.execTransactInternal(Binder.java:1179) 01-31 09:27:54.801 9805 11368 D testtest: at android.os.Binder.execTransact(Binder.java: 1143) 01-31 09:27:54.801 9805 11368 D testtest: at android.os.BinderProxy.transactNative(Native Method) 01-31 09:27:54.801 9805 11368 D testtest: at android.os.BinderProxy.transact(BinderProxy.java:571) 01-31 09:27:54.801 9805 11368 D testtest: at xx.xx.xx.xx.binder.aidl.IServer$Stub$Proxy.sendRequest(IServer.iava:167) ... 01-31 09:27:54.801 9805 11368 D testtest: at xx.xx.xx.xx.HttpServer.serve(HttpServer.kt:116) 01-31 09:27:54.801 9805 11368 D testtest: at org.nanohttpd.protocols.http.HTTPSession.execute(HTTPSession.java:142) 01-31 09:27:54.801 9805 11368 D testtest: at org.nanohttpd.protocols.http.ClientHandler.run(ClientHandler.java:12) 01-31 09:27:54.801 9805 11368 D testtest: at java.lang.Thread.run(Thread.java:920)
01-31 09:27:54.801 9805 11368 D testtest: at xx.xx.xx.xx.binder.aidl.IEventListener$Stub.onTransact(IEventListener.java:63) // 这里是service端回调client端注册的linstener 01-31 09:27:54.801 9805 11368 D testtest: at android.os.Binder.execTransactInternal(Binder.java:1179) 01-31 09:27:54.801 9805 11368 D testtest: at android.os.Binder.execTransact(Binder.java: 1143) 01-31 09:27:54.801 9805 11368 D testtest: at android.os.BinderProxy.transactNative(Native Method) 01-31 09:27:54.801 9805 11368 D testtest: at android.os.BinderProxy.transact(BinderProxy.java:571) 01-31 09:27:54.801 9805 11368 D testtest: at xx.xx.xx.xx.binder.aidl.IServer$Stub$Proxy.sendRequest(IServer.iava:167) // 这里是client端调用service端的方法
switch (cmd) { case BR_ONEWAY_SPAM_SUSPECT: ... case BR_TRANSACTION_COMPLETE: ... case BR_DEAD_REPLY: ... case BR_FAILED_REPLY: ... case BR_FROZEN_REPLY: ... case BR_ACQUIRE_RESULT: ... case BR_REPLY: { binder_transaction_data tr; err = mIn.read(&tr, sizeof(tr)); ALOG_ASSERT(err == NO_ERROR, "Not enough command data for brREPLY"); if (err != NO_ERROR) goto finish;
// https://cs.android.com/android/platform/superproject/+/android-13.0.0_r74:frameworks/native/libs/binder/IPCThreadState.cpp void IPCThreadState::joinThreadPool(bool isMain) { ... status_t result; do { ... result = getAndExecuteCommand(); ... // Let this thread exit the thread pool if it is no longer // needed and it is not the main process thread. if(result == TIMED_OUT && !isMain) { break; } } while (result != -ECONNREFUSED && result != -EBADF); ... }
status_t IPCThreadState::getAndExecuteCommand() { ... result = executeCommand(cmd); ... }