在Android应用里怎么解决爆棚问题
引言:
如果App引用的库太多,方法数超过65536后无法编译。这是因为单个dex里面不能有超过65536个方法。为什么有最大的限制呢, 因为android会把每一个类的方法id检索起来,存在一个链表结构里面。但是这个链表的长度是用一个short类型来保存的, short占两个字节(保存-2的15次方到2的15次方-1,即-32768~32767),最大保存的数量就是65536。新版本的Android系统中修复了这个问题, 但是我们仍然需要对低版本的Android系统做兼容。
解决方法有如下几个:
1.精简方法数量,删除没用到的类、方法、第三方库。
2.使用ProGuard去掉一些未使用的代码
3.复杂模块采用jni的方式实现,也可以对边缘模块采用本地插件化的方式。
4.分割Dex。本文介绍最后一种方法
配置操作:
dex文件拆成两个或多个,为此谷歌官方推出了multidex兼容包,配合AndroidStudio实现了一个APK包含多个dex的功能。 Android 的 Gradle插件在 Android Build Tool 21.1开始就支持使用multidex了。
1.修改Gradle的配置,支持multidex:
2.第二步分三种情况:
a.如果没有重写Application,在manifest文件中,在application标签下添加MultidexApplication Class的引用,看配置:
b.如果重写了Application,可以让自定义Applicationd继承android.support.multidex.MultiDexApplication。
c.如果重写了Application并且已经继承了其他Application类,可以重写attachBaseContext()方法,并添加语句MultiDex.install(this);看代码:
没什么特别问题,到这里就可以了,你的分包就完成了。
注意事项:Application 中的静态全局变量会比MutiDex的 install()方法优先加载,所以建议避免在Application类中使用静态变量引用 main classes.dex文件以外dex文件中的类。
网友评论