堆栈信息
"Binder:25407_D" prio=5 tid=42 Blocked | group="main" sCount=1 dsCount=0 flags=1 obj=0x14341e60 self=0xb4003ffe7f87e3c0 | sysTid=26283 nice=0 cgrp=default sched=0/0 handle=0x3ffc8e189cc0 | state=S schedstat=( 381790950 53211910 2682 ) utm=23 stm=14 core=124 HZ=100 | stack=0x3ffc8e092000-0x3ffc8e094000 stackSize=995KB | held mutexes= at com.android.server.wm.ActivityTaskManagerService$LocalService.getTopApp(ActivityTaskManagerService.java:7220)
"Binder:25407_F" prio=5 tid=120 Blocked | group="main" sCount=1 dsCount=0 flags=1 obj=0x13640700 self=0xb4003ffe7f8f9a70 | sysTid=26998 nice=0 cgrp=default sched=0/0 handle=0x3ffc47078cc0 | state=S schedstat=( 642065500 59367960 3956 ) utm=39 stm=24 core=118 HZ=100 | stack=0x3ffc46f81000-0x3ffc46f83000 stackSize=995KB | held mutexes= at com.android.server.am.ActivityManagerService.checkContentProviderAccess(ActivityManagerService.java:6829)
1
654656413245 42 天前
不要在广播里面 startActivity ,把广播的逻辑 post 到 handler 出去
|
2
honhon OP @654656413245 这里并没有在广播里面调用 finishReceiver ,是 ActivityManagerService.finishReceiver 的调用堆栈
|
3
xingda920813 41 天前
Android 12 修改了 ActivityTaskManagerService, 缓存了 mTopApp 的值, 从而在调用 ActivityTaskManagerService.getTopApp() 时不再需要获取 WindowManagerGlobalLock:
https://cs.android.com/android/platform/superproject/+/android-12.0.0_r33:frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java;bpv=0;bpt=0 相应的 Google Patch: https://cs.android.com/android/_/android/platform/frameworks/base/+/8f7dd59911eef213c0d1b5db460f6e8114aeeea0 里面明确提到了改动是为了避免锁住 WindowManager. 如果没办法适配 Android 12, 那只能自己做 Patch 把 Android 12 的这部分改动尝试 pick 进 Android 11, 或者去掉 getTopApp() 里的 synchronized 块, 不过这样将不再线程安全. |
4
honhon OP @xingda920813 学习了,感谢,目前暂时不能转到 android12 ,看能不能 pick 过来试试
|
5
honhon OP @xingda920813 关于这个调用栈我有个疑问请教一下大佬,在 Binder:25407_F 线程调用栈中 IActivityController.Sub.Proxy.activityStarting 方法,通过 binder 调用到了 ContentService 的 registerContentObserver,我怀疑这个回调是不是错误的
|
6
xingda920813 38 天前
@honhon 这个 IActivityController 的实际实现者既不在 system_server 进程中 (从 IActivityController$Stub$Proxy 和 BinderProxy 可以看出), 在 AOSP 中也没找到. 应该是一个单独的 signature 权限的 APK, 运行在单独的进程中.
activityStarting() 调到 registerContentObserver() 是否合理要看这个 IActivityController 的具体实现, 可以在系统启动时在 ActivityTaskManagerService.setActivityController() 里面打个断点看看 Binder.getCallingPid() 是哪个 APK. 这个调用栈看上去是运行在 system_server 的 ActivityTaskManagerService 通过 Binder 远程调用到 IActivityController 的实现 APK, IActivityController 的实现代码又通过 Binder 远程调用到 ContentService.registerContentObserver(), 又回到了 system_server. |