一个不普通的找不到类异常

今天在大鸡排群里,大鸡排说了个不普通的找不到类异常,是由分包问题与设备兼容导致的。我觉得他讲的很精彩,便建议他写在博文上。不过我不清楚他到底会不会写,而我又觉得很精彩,所以有意把它记录下来,倘若后边大鸡排也写了,那我就直接引用他的博文,放在文章开头。
大鸡排主页 http://www.jianshu.com/u/abc8086489c7


1、出现异常

这个异常很常见吧。


1.png

这个类是14年写的,类中定义了一个静态常量,一直稳定运行,直到今天突然发现它在某些设备上抛出异常?这到底是怎么回事呢?

2、分析原因

把历史版本的apk和刚编译完的apk拆包比对一下,如下图


一个不普通的找不到类异常_第1张图片
2.png

左边是历史版本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文件。

你可能感兴趣的:(一个不普通的找不到类异常)