构建相关问题
65K 方法数限制
简而言之:
编译器生成 classes.dex 文件时会给一个 dex 文件里的所有方法分配一个唯一 ID,而这个 ID 限于 Dalvik bytecode 操作数 16 bits 的限制,范围为 [0, 0xffff]。
在代码里区分 Debug 和 Release
使用 BuildConfig.DEBUG 并不总是准确,有几种方法来较为准确地区分当前是 Debug 版还是 Release 版,都是需要用 Gradle 脚本做一些配置。
方法一:
在 App 或者 Module 的 build.gradle 里添加配置:
gradle.startParameter.getTaskNames().each { task ->
println("task: " + task)
// library里 BuildConfig.DEBUG 默认一直是 flase 所以需要自定义
if (task.contains("Debug")) {
android {
defaultPublishConfig "debug"
}
} else if (task.contains("Release")) {
android {
defaultPublishConfig "release"
}
}
}
然后在代码里使用 BuildConfig.DEBUG 就准确了。
方法二:
buildTypes {
debug {
resValue "string", "build_config_type", "debug"
}
release {
resValue "string", "build_config_type", "release"
}
}
然后在代码里使用 context.getString(R.string.build_config_type) 值是否为 debug 来判断。
打包时分开生成 32 位和 64 位包
通过 splits.abi 配置来实现。
配置了 split.abi 后,defaultConfig.ndk.apiFilters 需要注释掉。
android {
splits {
abi {
enable true
reset()
include 'armeabi-v7a', 'arm64-v8a'
}
}
}
详细配置可参考官方文档:https://developer.android.google.cn/studio/build/configure-apk-splits.html#configure-abi-split
签名
命令行给 apk 签名
使用 jarsigner,具体的参数含义可以参考 jarsigner
命令的帮助提示。
jarsigner -verbose -keystore xxx.jks -signedjar signed.apk unsigned.apk [别名]