Android 4.4 以下multi dex的crash问题

本文详细分析了Android 4.4系统下MultiDex环境下Provider加载失败的问题,通过源码分析定位到问题根源,并提供了解决方案,即确保Provider类被打包到主dex中。

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

这篇文章的分析和结论有问题,请大家别看了,免的误导大家,需要重新整理和分析

在崩溃统计平台上看到有如下的一种crash

java.lang.RuntimeException:

at android.app.ActivityThread.installProvider (ActivityThread.java:4889)

at android.app.ActivityThread.installContentProviders (ActivityThread.java:4481)

at android.app.ActivityThread.handleBindApplication (ActivityThread.java:4421)

at android.app.ActivityThread.access$1500 (ActivityThread.java:141)

at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1272)

at android.os.Handler.dispatchMessage (Handler.java:102)

at android.os.Looper.loop (Looper.java:136)

at android.app.ActivityThread.main (ActivityThread.java:5113)

at java.lang.reflect.Method.invokeNative (Method.java)

at java.lang.reflect.Method.invoke (Method.java:515)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:796)

at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:612)

at dalvik.system.NativeStart.main (NativeStart.java)

Caused by: java.lang.ClassNotFoundException:

at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:56)

at java.lang.ClassLoader.loadClass (ClassLoader.java:497)

at java.lang.ClassLoader.loadClass (ClassLoader.java:457)

at android.app.ActivityThread.installProvider (ActivityThread.java:4874)

at android.app.ActivityThread.installContentProviders (ActivityThread.java:4481)

at android.app.ActivityThread.handleBindApplication (ActivityThread.java:4421)

at android.app.ActivityThread.access$1500 (ActivityThread.java:141)

at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1272)

at android.os.Handler.dispatchMessage (Handler.java:102)

at android.os.Looper.loop (Looper.java:136)

at android.app.ActivityThread.main (ActivityThread.java:5113)

at java.lang.reflect.Method.invokeNative (Method.java)

at java.lang.reflect.Method.invoke (Method.java:515)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:796)

at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:612)

at dalvik.system.NativeStart.main (NativeStart.java)

这个异常只存在Android 4.4机子以下的,现在竟然还有人玩4.4.这个老古董不管也不行,毕竟还有用户用.从异常栈分析,ActivityThread.installProvider的时候,加载不到对应的provider,我们去查看源码,源码是28的,和19比有点差距,但原理一样

1.是报错行,意思就是把provider加载到系统中,加载过程就不提了,反正系统找不到,我在项目里找了一遍,我们自己项目没有provider,应该是第三方注册的,反编译apk,发现在清单文件中,有provider注册

这就奇怪了,肯定不是这些类不存在。因为art机型基本没有这个问题,特点就是只dalvik中出现.反编译了查了下dex,我们项目是多dex,这些provider的特点是没有出现在class.dex中,也就是主dex中.但又想到我们在兼容4.4以下的多dex情况,在application中加了

@Override
protected void attachBaseContext(Context base) {
  super.attachBaseContext(base);
  MultiDex.install(this);
}

这么一句代码,将dex合并,按道理不应该出现问题.分析源码发现,installProvicer的调用时间比app的初始化方法调用要早,dex还没有合并,所以 MultiDex.install(this)不起作用,找到了原因,问题也就解决了一半.将provider类打进入主dex即可.在打包的时候,在build目录下会有maindexlist.txt,拷到app目录下,然后添加一行

然后在app.gradle文件中添加一行,使用改过的maindexlist.txt

这样问题即可解决,如果有不懂的,可以留言,欢迎大家一起讨论.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值