JNI ERROR global reference table overflow

本文详细分析了一起由于 BinderDeathTracker 引用超限导致的 Android systemui 模块崩溃问题。问题源于 MobileSignalController 中的 isVowifiAvailable() 方法频繁调用,进而初始化 BinderDeathTracker。解决方案是及时释放 ImsMmTelManager 的引用,避免内存泄漏。通过检查adb logcat 中重复出现的log,可以定位类似问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上查了非常多的文章,都没有特别有用,只能自己分析已有的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中显示的类或者方法有直接或者间接调用的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值