关于 64K 引用限制
是指单个DEX文件内可引用的方法总数不超过65,536
,即64 X 1024
,所以称为64K引用限制
。
可执行文件分包支持
Android5.0(21)后的ART原生支持从 APK 文件加载多个 DEX 文件,所以只要minSdkVersion
为21或更高,就不需要 Dalvik 可执行文件分包支持库。5.0之前的系统是需要Dalvik 可执行文件分包支持库的。
规避 64K 限制的方法
- 检查您的应用的直接和传递依赖项
不要仅仅为了使用依赖库的几个方法,就引入依赖库。 - 通过 ProGuard 移除未使用的代码
使用混淆的压缩功能,移除未使用到的代码。
配置Dalvik 可执行文件分包
multiDexEnabled true
compile 'com.android.support:multidex:1.0.1'
Multidex.install(this);
声明主 DEX 文件中需要的类
如果出现 java.lang.NoClassDefFoundError
,使用multiDexKeepFile
或multiDexKeepProguard
把该类添加到主DEX文件。
优化开发构建中的 Dalvik 可执行文件分包
Dalvik 可执行文件分包配置会大幅增加构建处理时间,因为要决定哪些类放在主DEX,哪些类放在铺DEX是非常复杂的,所以非常耗时。
可以利用productFlavors
来搞一个开发定制和发布定制,对于开发定制,将minSdkVersion
设置为 21,这样开发的时候构造将更快。
以下是配置示例:
android {
defaultConfig {
...
multiDexEnabled true
}
productFlavors {
dev {
// Enable pre-dexing to produce an APK that can be tested on
// Android 5.0+ without the time-consuming DEX build processes.
minSdkVersion 21
}
prod {
// The actual minSdkVersion for the production version.
minSdkVersion 14
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
您完成此配置变更后,可以为增量式构建使用应用的 devDebug 变体,后者集 dev 产品定制与 debug 构建类型的属性于一身。这将创建已启用 Dalvik 可执行文件分包且禁用 proguard 的可调试应用(因为 minifyEnabled 默认为 false)。这些设置会使适用于 Gradle 的 Android 插件执行以下操作:
- 执行 pre-dexing:将每个应用模块和每个依赖项构建为单独的 DEX 文件。
- 将每个 DEX 文件加入 APK,并且不做任何修改(不执行代码压缩)。
- 最重要的是,模块 DEX 文件不执行合并操作,因此可以避免为确定主 DEX 文件的内容而进行长时间的计算。
这些设置的好处是,可以进行快速的增量式构建,因为只有修改过的模块的 DEX 文件才会在后续构建期间重新计算并重新打包。但是,这些构建的 APK 只能用于在 Android 5.0 设备上进行测试。不过,由于是以定制形式实现配置,您保留了使用与发布相适的最低 API 级别和 ProGuard 代码压缩执行正常构建的能力。