網上查了非常多的文章,都沒有特别有用,隻能自己分析已有的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中顯示的類或者方法有直接或者間接調用的。