网上查了非常多的文章,都没有特别有用,只能自己分析已有的log,从crash dump的log中看到报错的是systemui模块,具体报错log如下:
Cmdline: com.android.systemui
pid: 3329, tid: 3329, name: ndroid.systemui >>> com.android.systemui <<<
log中的Summary下显示是因为BinderCacheManager的BinderDeathTracker被引用了50133次,和其他的一些引用加起来超过了51200的限制。
Summary:
50113 of android.telephony.BinderCacheManager$BinderDeathTracker (50113 unique instances)
adb log中有一个log频繁打印,找到了systemui模块下的MobileSignalController.java中的isVowifiAvailable()方法。
39645766 20.08.2022 23:15:03.992 Main 3329 3446 LogcatInfo NetworkController.MobileSignalController(1) isVowifiAvailable,mVoWiFiSettingEnabled = falsemMMtelVowifi = false
在isVowifiAvailable()方法中,会去获取BinderCacheManager,并且调用到getBinder()方法,getBinder()方法接着会初始化BinderDeathTracker。由于MobileSignalController中的isVowifiAvailable()方法会被频繁调用,导致了对BinderDeathTracker的引用慢慢的超过了限制。
修改前代码:
try {
final ImsMmTelManager imsMmTelManager =
ImsMmTelManager.createForSubscriptionId(activeDataSubId);
// From CarrierConfig Settings
mVoWiFiSettingEnabled = imsMmTelManager.isVoWiFiSettingEnabled();
} catch (IllegalArgumentException exception) {
Log.w(mTag, "fail to get Wfc settings. subId=" + activeDataSubId, exception);
}
修改后代码:
ImsMmTelManager imsMmTelManager;
try {
imsMmTelManager =
ImsMmTelManager.createForSubscriptionId(activeDataSubId);
// From CarrierConfig Settings
mVoWiFiSettingEnabled = imsMmTelManager.isVoWiFiSettingEnabled();
} catch (IllegalArgumentException exception) {
Log.w(mTag, "fail to get Wfc settings. subId=" + activeDataSubId, exception);
} finaly {
imsMmTelManager = null;
}
解决方案:因为这个是局部变量,在使用完以后及时进行设为null值,不再对ImsMmTelManager引用。
经验:可以在adb log中查看一些重复出现多次的log,查看log附近的代码是否有对Summary中显示的类或者方法有直接或者间接调用的。