这篇文章的分析和结论有问题,请大家别看了,免的误导大家,需要重新整理和分析
在崩溃统计平台上看到有如下的一种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
这样问题即可解决,如果有不懂的,可以留言,欢迎大家一起讨论.