【Android】BinderProxy.transact / BpBinder::transact 默认同步, 异步需加FLAG_ONEWAY

博客围绕Android的BinderProxy.transact和BpBinder::transact展开,指出其默认是同步操作,若要实现异步操作,需要添加FLAG_ONEWAY。
                
"MAPCommonThreadPool#1" prio=5 tid=58 Native | group="main" sCount=1 ucsCount=0 flags=1 obj=0x2262690 self=0xb400007b0b128000 | sysTid=13530 nice=0 cgrp=top-app sched=0/0 handle=0x79dcbf8500 | state=S schedstat=( 371067697 631622388 1007 ) utm=22 stm=14 core=5 HZ=100 | stack=0x79dcaf5000-0x79dcaf7000 stackSize=1037KB | held mutexes= native: #00 pc 000f40c8 /apex/com.android.runtime/lib64/bionic/libc.so (__ioctl+8) (BuildId: 154bc2ed884eb3475ddfa6bd20c12cb5) native: #01 pc 0009302c /apex/com.android.runtime/lib64/bionic/libc.so (ioctl+156) (BuildId: 154bc2ed884eb3475ddfa6bd20c12cb5) native: #02 pc 00068bb4 /system/lib64/libbinder.so (android::IPCThreadState::transact+7684) (BuildId: 4fd198f70b833f5ea951fd3394b26dfa) native: #03 pc 0006fac0 /system/lib64/libbinder.so (android::BpBinder::transact+512) (BuildId: 4fd198f70b833f5ea951fd3394b26dfa) native: #04 pc 001f3bc8 /system/lib64/libandroid_runtime.so (android_os_BinderProxy_transact+392) (BuildId: 09a3ecef1e87b94c1ce97d0d8cacfa29) at android.os.BinderProxy.transactNative(Native method) at android.os.BinderProxy.transact(BinderProxy.java:685) at android.content.ContentProviderProxy.query(ContentProviderNative.java:493) at android.content.ContentProviderClient.query(ContentProviderClient.java:196) at android.content.ContentProviderClient.query(ContentProviderClient.java:178) at android.content.ContentProviderClient.query(ContentProviderClient.java:168) at com.amazon.identity.auth.device.x9.a(DCP:4) at com.amazon.identity.auth.device.la.a(DCP:35) at com.amazon.identity.auth.device.y9.a(DCP:2) at com.amazon.identity.auth.device.storage.i.g(DCP:41) at com.amazon.identity.auth.device.storage.i.d(DCP:33) - locked <0x034ebe33> (a com.amazon.identity.auth.device.storage.i) at com.amazon.identity.auth.device.storage.i.c(DCP:8) - locked <0x034ebe33> (a com.amazon.identity.auth.device.storage.i) at com.amazon.identity.auth.device.k3.a(DCP:40) at com.amazon.identity.auth.device.k3$a.run(DCP:1) at com.amazon.identity.auth.device.ib$a.run(DCP:2) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651) at java.lang.Thread.run(Thread.java:1119) DumpLatencyMs: 75.6581
08-22
----- pid 3318 at 2025-11-19 09:30:55.242057584+0800 ----- Cmd line: system_server "android.fg" prio=5 tid=16 Blocked | group="main" sCount=1 ucsCount=0 flags=1 obj=0x20add90 self=0xb400007525d7f000 | sysTid=3534 nice=0 cgrp=ssfg sched=0/0 handle=0x751be3d4c0 | state=S schedstat=( 625009213 5676315315 3204 ) utm=25 stm=36 core=3 HZ=100 | stack=0x751ba3a000-0x751ba3c000 stackSize=4109KB | held mutexes= at com.android.server.location.listeners.ListenerMultiplexer.updateRegistrations(ListenerMultiplexer.java:536) - waiting to lock <0x0837f193> (a java.lang.Object) held by thread 308 at com.android.server.location.provider.LocationProviderManager.onAppForegroundChanged(LocationProviderManager.java:2774) at com.android.server.location.provider.LocationProviderManager.$r8$lambda$a3Z8nDABZyLkK2LFh8YIMBZZX6E(unavailable:0) at com.android.server.location.provider.LocationProviderManager$$ExternalSyntheticLambda12.onAppForegroundChanged(D8$$SyntheticClass:0) at com.android.server.location.injector.AppForegroundHelper.notifyAppForeground(AppForegroundHelper.java:71) at com.android.server.location.injector.SystemAppForegroundHelper.lambda$onAppForegroundChanged$0(SystemAppForegroundHelper.java:59) at com.android.server.location.injector.SystemAppForegroundHelper.$r8$lambda$UCfitvFhYxwpzpERUdvbWiHsEkc(unavailable:0) at com.android.server.location.injector.SystemAppForegroundHelper$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:0) at android.os.Handler.handleCallback(Handler.java:1027) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loopOnce(Looper.java:298) at android.os.Looper.loop(Looper.java:408) at android.os.HandlerThread.run(HandlerThread.java:85) at com.android.server.ServiceThread.run(ServiceThread.java:49) DumpLatencyMs: 40.4077 卡在native层的binder调用上 "binder:3318_C" prio=5 tid=308 Native | group="main" sCount=1 ucsCount=0 flags=1 obj=0x4dd2348 self=0xb4000073db20d000 | sysTid=4697 nice=0 cgrp=ssfg sched=1073741824/0 handle=0x75218c04c0 | state=S schedstat=( 2269165221 13494012147 7174 ) utm=144 stm=82 core=3 HZ=100 | stack=0x75217c9000-0x75217cb000 stackSize=989KB | held mutexes= native: #00 pc 000f1b4c /apex/com.android.runtime/lib64/bionic/libc.so (__ioctl+12) (BuildId: ea7b19bd582e7030a81f9d21fbcb1833) native: #01 pc 00096724 /apex/com.android.runtime/lib64/bionic/libc.so (ioctl+156) (BuildId: ea7b19bd582e7030a81f9d21fbcb1833) native: #02 pc 0006cc3c /system/lib64/libbinder.so (android::IPCThreadState::transact+7680) (BuildId: b07a4f939f8d4b594a62afa98b130713) native: #03 pc 00073c18 /system/lib64/libbinder.so (android::BpBinder::transact+516) (BuildId: b07a4f939f8d4b594a62afa98b130713) native: #04 pc 001fcdd8 /system/lib64/libandroid_runtime.so (android_os_BinderProxy_transact+400) (BuildId: baa0dc7db2006a269c302c1ffa6766ff) at android.os.BinderProxy.transactNative(Native method) at android.os.BinderProxy.transact(BinderProxy.java:685) at com.android.internal.telephony.ITelephony$Stub$Proxy.isInEmergencySmsMode(ITelephony.java:14025) at android.telephony.TelephonyManager.isInEmergencySmsMode(TelephonyManager.java:10321) at com.android.server.location.injector.SystemEmergencyHelperExtImpl.checkEmergencyStatesLockFree(SystemEmergencyHelperExtImpl.java:170) at com.android.server.location.injector.SystemEmergencyHelperExtImpl.isInEmergencyLockFree(SystemEmergencyHelperExtImpl.java:197) at com.android.server.location.injector.SystemEmergencyHelperExtImpl.isInEmergencyWithLockOrder(SystemEmergencyHelperExtImpl.java:98) at com.android.server.location.injector.SystemEmergencyHelper.isInEmergency(SystemEmergencyHelper.java:132) at com.android.server.location.provider.LocationProviderManager$Registration.onRegister(LocationProviderManager.java:488) at com.android.server.location.provider.LocationProviderManager$LocationRegistration.onRegister(LocationProviderManager.java:917) at com.android.server.location.provider.LocationProviderManager$LocationListenerRegistration.onRegister(LocationProviderManager.java:1239) at com.android.server.location.listeners.RemovableListenerRegistration.onRegister(RemovableListenerRegistration.java:102) at com.android.server.location.listeners.ListenerMultiplexer.replaceRegistration(ListenerMultiplexer.java:313) - locked <0x0837f193> (a java.lang.Object) at com.android.server.location.listeners.ListenerMultiplexer.putRegistration(ListenerMultiplexer.java:257) at com.android.server.location.provider.LocationProviderManager.registerLocationRequest(LocationProviderManager.java:2244) - locked <0x0837f193> (a java.lang.Object) at com.android.server.location.LocationManagerService.registerLocationListener(LocationManagerService.java:1043) at android.location.ILocationManager$Stub.onTransact(ILocationManager.java:602) at android.os.Binder.execTransactInternal(Binder.java:1444) at android.os.Binder.execTransact(Binder.java:1378) DumpLatencyMs: 232.181 行 17021: outgoing transaction 351574: 0000000032bc1d5b from 3318:4697 to 4747:9087 code d0 flags 12 pri 0:120 r1 elapsed 311489ms ----- pid 4747 at 2025-11-19 09:30:55.842247428+0800 ----- Cmd line: com.android.phone "binder:4747_A" prio=5 tid=82 Blocked | group="main" sCount=1 ucsCount=0 flags=1 obj=0x2294c68 self=0xb400007636cf6c00 | sysTid=9087 nice=0 cgrp=foreground sched=0/0 handle=0x766069d4c0 | state=S schedstat=( 131752756 1463738079 572 ) utm=3 stm=9 core=0 HZ=100 | stack=0x76605a6000-0x76605a8000 stackSize=989KB | held mutexes= at android.hardware.display.DisplayManagerGlobal.getDisplayInfo(DisplayManagerGlobal.java:262) - waiting to lock <0x03b9bc9d> (a java.lang.Object) held by thread 1 at android.hardware.display.DisplayManagerGlobal.getCompatibleDisplay(DisplayManagerGlobal.java:375) at android.app.ResourcesManager.getAdjustedDisplay(ResourcesManager.java:587) at android.app.ContextImpl.getDisplayNoVerify(ContextImpl.java:3278) at android.app.ContextImpl.getDisplayId(ContextImpl.java:3287) at android.app.ContextImpl.createPackageContextAsUser(ContextImpl.java:2887) at android.app.ContextImpl.createContextAsUser(ContextImpl.java:2906) at android.content.ContextWrapper.createContextAsUser(ContextWrapper.java:1147) at com.android.phone.PhoneInterfaceManager.getCurrentPackageName(unavailable:20) at com.android.phone.PhoneInterfaceManager.isInEmergencySmsMode(unavailable:5) at com.android.internal.telephony.ITelephony$Stub.onTransact(ITelephony.java:7398) at com.android.phone.PhoneInterfaceManager.onTransact(unavailable:48) at android.os.Binder.execTransactInternal(Binder.java:1439) at android.os.Binder.execTransact(Binder.java:1378) DumpLatencyMs: 77.8276 "main" prio=5 tid=1 Native | group="main" sCount=1 ucsCount=0 flags=1 obj=0x74941248 self=0xb40000766cac7000 | sysTid=4747 nice=0 cgrp=foreground sched=0/0 handle=0x7724350098 | state=S schedstat=( 1700122029 6616035182 4609 ) utm=112 stm=57 core=1 HZ=100 | stack=0x7fd1768000-0x7fd176a000 stackSize=8188KB | held mutexes= native: #00 pc 000f1b4c /apex/com.android.runtime/lib64/bionic/libc.so (__ioctl+12) (BuildId: ea7b19bd582e7030a81f9d21fbcb1833) native: #01 pc 00096724 /apex/com.android.runtime/lib64/bionic/libc.so (ioctl+156) (BuildId: ea7b19bd582e7030a81f9d21fbcb1833) native: #02 pc 0006cc3c /system/lib64/libbinder.so (android::IPCThreadState::transact+7680) (BuildId: b07a4f939f8d4b594a62afa98b130713) native: #03 pc 00073c18 /system/lib64/libbinder.so (android::BpBinder::transact+516) (BuildId: b07a4f939f8d4b594a62afa98b130713) native: #04 pc 001fcdd8 /system/lib64/libandroid_runtime.so (android_os_BinderProxy_transact+400) (BuildId: baa0dc7db2006a269c302c1ffa6766ff) at android.os.BinderProxy.transactNative(Native method) at android.os.BinderProxy.transact(BinderProxy.java:685) at android.hardware.display.IDisplayManager$Stub$Proxy.getDisplayIds(IDisplayManager.java:1284) at android.hardware.display.DisplayManagerGlobal.getDisplayIds(DisplayManagerGlobal.java:319) - locked <0x03b9bc9d> (a java.lang.Object) at android.hardware.display.DisplayManager.getDisplays(DisplayManager.java:780) at android.hardware.display.DisplayManager.getDisplays(DisplayManager.java:753) at com.android.internal.telephony.DeviceStateMonitor.isScreenOn(DeviceStateMonitor.java:782) at com.android.internal.telephony.DeviceStateMonitor.-$$Nest$misScreenOn(DeviceStateMonitor.java:0) at com.android.internal.telephony.DeviceStateMonitor$2.onDisplayChanged(DeviceStateMonitor.java:236) at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.handleDisplayEventInner(DisplayManagerGlobal.java:1620) at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.lambda$sendDisplayEvent$0(DisplayManagerGlobal.java:1559) at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.$r8$lambda$U7s70EKugVQNzFVIVvJsNmT_WdQ(unavailable:0) at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0) at android.os.Handler.handleCallback(Handler.java:1027) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loopOnce(Looper.java:298) at android.os.Looper.loop(Looper.java:408) at android.app.ActivityThread.main(ActivityThread.java:9964) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:613) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1074) DumpLatencyMs: 1.48333 行 13813: outgoing transaction 354449: 00000000ecf0340a from 4747:4747 to 3318:0 code 2 flags 10 pri 0:120 r1 elapsed 310711ms那么这部分堆栈打印可以说明3318死锁或卡死了吗
最新发布
11-20
[Summary] WDT重启,binder耗尽 ,均阻塞在322进程,通信同事接力分析 [Analysis] 10-02 22:36:05.434 1939 1991 I watchdog: Blocked in monitor com.android.server.Watchdog$BinderThreadMonitor on monitor thread (watchdog.monitor) for 261s, Blocked in handler on foreground thread (android.fg) for 261s "watchdog.monitor" prio=5 tid=15 Native | group="main" sCount=1 ucsCount=0 flags=1 obj=0x20aad60 self=0xb400007d51b8d400 | sysTid=1984 nice=0 cgrp=ssfg sched=1073741824/0 handle=0x7ccf5f1500 | state=S schedstat=( 29810006541 74797527195 68567 ) utm=220 stm=2760 core=1 HZ=100 | stack=0x7ccf4ee000-0x7ccf4f0000 stackSize=1037KB | held mutexes= native: #00 pc 000aeb1c /apex/com.android.runtime/lib64/bionic/libc.so (syscall+28) (BuildId: 3f19d51661ab37dc2615425c410f5810) native: #01 pc 000897f0 /apex/com.android.runtime/lib64/bionic/libc.so (__futex_wait_ex+144) (BuildId: 3f19d51661ab37dc2615425c410f5810) native: #02 pc 00097688 /apex/com.android.runtime/lib64/bionic/libc.so (pthread_cond_wait+72) (BuildId: 3f19d51661ab37dc2615425c410f5810) native: #03 pc 000a0f28 /system/lib64/libc++.so (std::__1::condition_variable::wait+28) (BuildId: ada37e5198285720b02f7d77fd27626c7782fe29) native: #04 pc 00079e2c /system/lib64/libbinder.so (void std::__1::condition_variable::wait<android::IPCThreadState::blockUntilThreadAvailable::$_0> +124) (BuildId: 9eab5f4500f6156bca8298eab3c8594e) native: #05 pc 00079d64 /system/lib64/libbinder.so (android::IPCThreadState::blockUntilThreadAvailable+84) (BuildId: 9eab5f4500f6156bca8298eab3c8594e) at android.os.Binder.blockUntilThreadAvailable(Native method) at com.android.server.Watchdog$BinderThreadMonitor.monitor(Watchdog.java:493) at com.android.server.Watchdog$HandlerChecker.run(Watchdog.java:416) at android.os.Handler.handleCallback(Handler.java:1027) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loopOnce(Looper.java:298) at android.os.Looper.loop(Looper.java:408) at android.os.HandlerThread.run(HandlerThread.java:85) at com.android.server.ServiceThread.run(ServiceThread.java:49) DumpLatencyMs: 46.7253 "android.fg" prio=5 tid=16 Blocked | group="main" sCount=1 ucsCount=0 flags=1 obj=0x20ab4e0 self=0xb400007cd1e52000 | sysTid=1985 nice=0 cgrp=ssfg sched=1073741824/0 handle=0x7cce4e1500 | state=S schedstat=( 1921729681414 19614127847990 5882693 ) utm=105522 stm=86650 core=1 HZ=100 | stack=0x7cce3de000-0x7cce3e0000 stackSize=1037KB | held mutexes= at com.android.server.location.listeners.ListenerMultiplexer.updateRegistrations(ListenerMultiplexer.java:513) - waiting to lock <0x0f48195a> (a java.lang.Object) held by thread 322 at com.android.server.location.provider.LocationProviderManager.onAppForegroundChanged(LocationProviderManager.java:2762) at com.android.server.location.provider.LocationProviderManager.$r8$lambda$a3Z8nDABZyLkK2LFh8YIMBZZX6E(unavailable:0) at com.android.server.location.provider.LocationProviderManager$$ExternalSyntheticLambda12.onAppForegroundChanged(D8$$SyntheticClass:0) at com.android.server.location.injector.AppForegroundHelper.notifyAppForeground(AppForegroundHelper.java:71) at com.android.server.location.injector.SystemAppForegroundHelper.lambda$onAppForegroundChanged$0(SystemAppForegroundHelper.java:59) at com.android.server.location.injector.SystemAppForegroundHelper.$r8$lambda$UCfitvFhYxwpzpERUdvbWiHsEkc(unavailable:0) at com.android.server.location.injector.SystemAppForegroundHelper$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:0) at android.os.Handler.handleCallback(Handler.java:1027) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loopOnce(Looper.java:298) at android.os.Looper.loop(Looper.java:408) at android.os.HandlerThread.run(HandlerThread.java:85) at com.android.server.ServiceThread.run(ServiceThread.java:49) DumpLatencyMs: 52.4102 "binder:1939_13" prio=5 tid=322 Native | group="main" sCount=1 ucsCount=0 flags=1 obj=0x4d59780 self=0xb400007b1f0f4000 | sysTid=5087 nice=0 cgrp=ssfg sched=1073741824/0 handle=0x7b2681c500 | state=S schedstat=( 3320469563579 3920000043229 6639538 ) utm=213398 stm=118648 core=4 HZ=100 | stack=0x7b26725000-0x7b26727000 stackSize=989KB | held mutexes= native: #00 pc 000f40c8 /apex/com.android.runtime/lib64/bionic/libc.so (__ioctl+8) (BuildId: 3f19d51661ab37dc2615425c410f5810) native: #01 pc 0009302c /apex/com.android.runtime/lib64/bionic/libc.so (ioctl+156) (BuildId: 3f19d51661ab37dc2615425c410f5810) native: #02 pc 00068bb4 /system/lib64/libbinder.so (android::IPCThreadState::transact+7684) (BuildId: 9eab5f4500f6156bca8298eab3c8594e) native: #03 pc 0006fac0 /system/lib64/libbinder.so (android::BpBinder::transact+512) (BuildId: 9eab5f4500f6156bca8298eab3c8594e) native: #04 pc 001f3bc8 /system/lib64/libandroid_runtime.so (android_os_BinderProxy_transact+392) (BuildId: ef1ce8f6f62ee484f01eb7908628b138) at android.os.BinderProxy.transactNative(Native method) at android.os.BinderProxy.transact(BinderProxy.java:685) at com.android.internal.telephony.ITelephony$Stub$Proxy.getEmergencyCallbackMode(ITelephony.java:13537) at android.telephony.TelephonyManager.getEmergencyCallbackMode(TelephonyManager.java:15045) at android.telephony.TelephonyManager.getEmergencyCallbackMode(TelephonyManager.java:15030) at com.android.server.location.injector.SystemEmergencyHelper.isInEmergency(SystemEmergencyHelper.java:152) - locked <0x0f08678b> (a com.android.server.location.injector.SystemEmergencyHelper) at com.android.server.location.provider.LocationProviderManager$Registration.onRegister(LocationProviderManager.java:488) at com.android.server.location.provider.LocationProviderManager$LocationRegistration.onRegister(LocationProviderManager.java:909) at com.android.server.location.provider.LocationProviderManager$LocationListenerRegistration.onRegister(LocationProviderManager.java:1231) at com.android.server.location.listeners.RemovableListenerRegistration.onRegister(RemovableListenerRegistration.java:102) at com.android.server.location.listeners.ListenerMultiplexer.replaceRegistration(ListenerMultiplexer.java:304) - locked <0x0f48195a> (a java.lang.Object) at com.android.server.location.listeners.ListenerMultiplexer.putRegistration(ListenerMultiplexer.java:248) at com.android.server.location.provider.LocationProviderManager.registerLocationRequest(LocationProviderManager.java:2232) - locked <0x0f48195a> (a java.lang.Object) at com.android.server.location.LocationManagerService.registerLocationListener(LocationManagerService.java:1043) at android.location.ILocationManager$Stub.onTransact(ILocationManager.java:602) at android.os.Binder.execTransactInternal(Binder.java:1444) at android.os.Binder.execTransact(Binder.java:1378) DumpLatencyMs: 328.888
10-12
之前的报错信息 `ContextImpl: Calling a method in the system process without a qualified user...` 可能会影响当前出现的包含特定 native 堆栈信息且出现 ANR(Application Not Responding)的情况。 之前的报错表明在系统进程中调用方法时没有合格用户,这通常与 Android 系统对后台服务启动的限制有关。当应用在后台尝试启动服务时,如果不符合系统要求,就会触发该错误。这种错误可能会导致系统资源分配出现问题,例如服务无法正常启动,资源无法正确释放等。 而 ANR 问题通常是由于主线程被阻塞,无法及时响应用户输入或系统事件导致的。如果之前的服务启动错误影响了系统资源的正常分配和使用,可能会导致主线程在执行某些操作时被阻塞,从而引发 ANR 问题。 例如,如果服务启动失败,可能会导致一些必要的初始化操作没有完成,当主线程需要使用这些资源时,就会出现阻塞。另外,服务启动错误可能会导致系统出现异常,从而影响其他进程或线程的正常运行,间接导致主线程被阻塞。 不过,ANR 问题也可能是由其他原因引起的,例如在主线程中执行了耗时操作、死锁等。因此,需要对具体的 native 堆栈信息进行分析,以确定 ANR 问题的根本原因。 ```java // 示例代码,展示可能导致 ANR 的耗时操作 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 在主线程中执行耗时操作,可能导致 ANR try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值