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

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


1、出现异常

这个异常很常见吧。


1.png

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

2、分析原因

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


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文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,322评论 25 709
  • 效果还是自己体验吧~~~常用哦 1.NSKernAttributeName: @10 调整字句 kerning 字...
    飞奔的羊阅读 4,643评论 0 0
  • 1 前段时间,和朋友在一起聊天,无意中聊到一位女友,现在的她整天一张苦瓜脸,看谁都不顺眼,跟你聊天就是爆粗话,说人...
    雪绒花飞阅读 5,523评论 0 5
  • 最近终于看了一直心心念念的《记忆大师》,怎么评价呢?可能没有想象中那么出彩,但是也绝对称得上是一部很不错的悬疑大片...
    与润听荷阅读 1,534评论 0 0
  • 博博因为高考成绩发愁,在我看来是多么幸福的烦恼! 如果上天再给我一次高中和18岁,人生应该大不同吧。 可是哪有那么...
    礽哥儿阅读 988评论 0 0