今天在大鸡排群里,大鸡排说了个不普通的找不到类异常,是由分包问题与设备兼容导致的。我觉得他讲的很精彩,便建议他写在简书博文上。不过我不清楚他到底会不会写,而我又觉得很精彩,所以有意把它记录下来,倘若后边大鸡排也写了,那我就直接引用他的博文,放在文章开头。
大鸡排主页 http://www.jianshu.com/u/abc8086489c7
1、出现异常
这个异常很常见吧。
这个类是14年写的,类中定义了一个静态常量,一直稳定运行,直到今天突然发现它在某些设备上抛出异常?这到底是怎么回事呢?
2、分析原因
把历史版本的apk和刚编译完的apk拆包比对一下,如下图
左边是历史版本apk,只有一个dex文件,而右边刚编译完的apk有两个dex文件。恰好5.0以下的设备只能读取一个dex文件并且必须是第一个,所以就抛出了找不到类异常,5.0以上的设备能读取多个。
右边apk出现了两个dex文件,因为一个classes.dex文件只能包含65536个方法,超出则会创建第二个文件classes2.dex。
原来打包压缩后就8M,后面因为业务拓展接入了一个直播平台的sdk,引入了大量jar包和so库,瞬间增加到27M,主要原因还是so库做了兼容。sdk太烂了,导致引入了大量方法,编译时就产生了两个dex文件,后来大鸡排二次封装了一套sdk。
3、如何解决呢?
在gradle中添加如下依赖:
dependencies {
classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.2.1'
}
apply plugin: 'com.getkeepsafe.dexcount'
打包后会在outputs下生成一个debug文件,
在debug文件中重写如下方法
compile 'com.android.support:multidex:+'
@Overrideprotected void attachBaseContext(Context base) { super.attachBaseContext(base);
MultiDex.install(this);
}
这个方法可以兼容5.0以下的设备读取多个dex文件。