Android64K方法编译限制

来源:互联网 发布:网络推广代理平台 编辑:程序博客网 时间:2024/06/06 03:40

什么是64k问题

Android平台的Java虚拟机Dalvik执行Dex程序时,使用的是short类型来索引DEX文件中的方法。这就意味着单个Dex文件可被引用的方法总数被限制为64x1024, 即65536。随着项目发展,有可能就会超过64K方法,这个时候编译将会报错.
Android官方64K说明

解决问题

1. build.gradle添加multidex依赖
dependencies { compile 'com.android.support:multidex:1.0.0'}

2. 项目Appplication继承MultiDexApplication
Modify your manifest to reference the MultiDexApplication class

3. builder.gradle加配置
android {
 defaultConfig {
...
 minSdkVersion 14
targetSdkVersion 21
...
  // Enabling multidex support.
multiDexEnabled true
 }
...}

使用mutidex的负面影响

1. 由于是分2个dex文件,安装启动的时候如果需要从这2个dex文件上获取数据,而dex文件太大,有可能会ANR.
2. 在4.0(API level 14)前使用multidex模式可能不能启动, 原因在于Dalvik线性分配的bug(Issue [22586(http://b.android.com/22586)).如果一定要用,详细测试这些api等级
是否有问题,最好是减少代码.
3. 使用multidex会造成巨大的内存分配,可能会oom,由于Dalvik 线性内存分配限制 (Issue 78035).这个限制在Android 4.0 (API level 14)做了增加,但是Android 5.0 (API level 21)前仍有可能有此限制.
4. calsses执行在Dalvik runtime的时候需要在primary dex file.这挺复杂的.Android build tooling 会处理好 Android原本的代码,有些但项目包含的libraries依赖native code(JNI).这些包可能无法使用直到multidex build tools 允许你把类似的特殊classes添加到primary dex file.也就是有些依赖工程或者jra包会有问题.

建议

尽量减少项目不必要的方法数.通过混淆优化代码.
AndroidStudio 2.2版本及以上可以在工具栏Builer->Analyze Apk ->classdex8查看方法数使用详情.
项目有意识的去减少不必要的方法数,触及64K的底线还是挺难的.

0 0
原创粉丝点击