天天看點

JNI ERROR global reference table overflow

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