Android11 AMS 死锁问题求助

57 天前
 honhon

堆栈信息

"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)

2089 次点击
所在节点    Android
6 条回复
654656413245
56 天前
不要在广播里面 startActivity ,把广播的逻辑 post 到 handler 出去
honhon
56 天前
@654656413245 这里并没有在广播里面调用 finishReceiver ,是 ActivityManagerService.finishReceiver 的调用堆栈
xingda920813
55 天前
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 块, 不过这样将不再线程安全.
honhon
53 天前
@xingda920813 学习了,感谢,目前暂时不能转到 android12 ,看能不能 pick 过来试试
honhon
53 天前
@xingda920813 关于这个调用栈我有个疑问请教一下大佬,在 Binder:25407_F 线程调用栈中 IActivityController.Sub.Proxy.activityStarting 方法,通过 binder 调用到了 ContentService 的 registerContentObserver,我怀疑这个回调是不是错误的
xingda920813
52 天前
@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.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1075822

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX