Android低版本设备出现java.lang.ClassCastException崩溃求助
问题分析与解决方案
原因分析
这是Android 8.1(API 27)至Android 10(API 29)系统内置ArrayMap的内存复用逻辑bug导致的:
- 该版本区间的
ArrayMap会缓存已分配的数组对象以优化性能,但缓存复用逻辑存在漏洞——如果之前缓存的是String类型数组,后续代码尝试将其强制转为Object[]时就会抛出ClassCastException。 - 近2个月未修改代码却突然出现崩溃,大概率是第三方SDK(如Google Ads、Google Analytics所属的GMS服务)的远程更新触发了这个系统bug,而非你的代码问题。
可行解决方案
1. 禁用ArrayMap全局缓存(最直接有效)
通过反射清空ArrayMap的全局缓存池,避免复用错误类型的数组。在自定义Application的onCreate()方法中添加以下代码:
import android.util.ArrayMap; import android.os.Build; import java.lang.reflect.Field; public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); // 仅针对受影响的Android版本执行 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1 && Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) { try { Field baseCacheField = ArrayMap.class.getDeclaredField("mBaseCache"); baseCacheField.setAccessible(true); baseCacheField.set(null, null); Field twiceBaseCacheField = ArrayMap.class.getDeclaredField("mTwiceBaseCache"); twiceBaseCacheField.setAccessible(true); twiceBaseCacheField.set(null, null); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } } }
2. 升级第三方依赖
检查并升级项目中Google Play Services相关依赖到最新稳定版,例如:
- 将
com.google.android.gms:play-services-ads升级至最新版本 - 将
com.google.android.gms:play-services-analytics升级至最新版本
Google可能已经在SDK中修复了触发该系统bug的逻辑。
3. 临时规避:限制SDK行为(可选)
如果升级依赖无法解决,可以尝试临时关闭部分第三方SDK的非核心功能(如非必要的广告或分析上报),但这仅作为临时应急方案,不推荐长期使用。
崩溃日志参考
Fatal Exception: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[] at android.util.ArrayMap.allocArrays(ArrayMap.java:174) at android.util.ArrayMap.put(ArrayMap.java:463) at android.os.BaseBundle.putString(BaseBundle.java:503) at com.google.android.gms.ads.internal.scionintegration.l.n(:com.google.android.gms.policy_ads_fdr_dynamite@24) at com.google.android.gms.ads.internal.scionintegration.l.i(:com.google.android.gms.policy_ads_fdr_dynamite@24) at com.google.android.gms.ads.internal.gmsg.ap.a(:com.google.android.gms.policy_ads_fdr_dynamite@24) at com.google.android.gms.ads.internal.webview.r.x(:com.google.android.gms.policy_ads_fdr_dynamite@24) at com.google.android.gms.ads.internal.webview.r.e(:com.google.android.gms.policy_ads_fdr_dynamite@24) at com.google.android.gms.ads.internal.webview.an.run(:com.google.android.gms.policy_ads_fdr_dynamite@24) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at m.bcf.a(:com.google.android.gms.policy_ads_fdr_dynamite@24) at com.google.android.gms.ads.internal.util.f.a(:com.google.android.gms.policy_ads_fdr_dynamite@24) at m.bcf.dispatchMessage(:com.google.android.gms.policy_ads_fdr_dynamite@24) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6121) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

