记一些以前不知道的 Gradle 配置
记一些以前不知道的 Gradle 配置
前言
关于 Gradle 的使用,最多的操作就是导库,顶多也就配置过自动签名,因为实战上没这个需求自己也不太主动学。我一向都是用什么学什么,只要我需要做一个东西,跨技术甚至跨领域都没关系。可能今天想做 Android 程序后天就觉得有个想法需要学建站技术才能实现,然后打游戏需要 记 BOSS 技能 CD 时间又做了个桌面定时软件,我甚至接触过编曲。但是如果我不需要做的功能,可能就瞟一眼完事,不会去深入理解,超懒
发现了个官方文档:https://google.github.io/android-gradle-dsl/current/index.html
另外,Gradle 编译默认不是多线程的

ABI 管理
我甚至都不知道这个东西的专有名词是叫 ABI
啥是 ABI
ABI 是 Application Binary Interface 的缩写
典型的 ABI 包含以下信息:
- 机器代码应使用的 CPU 指令集
- 运行时内存存储和加载的字节顺序
- 可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型(例如 .so)
- 用于解析内容与系统之间数据的各种约定。这些约定包括对齐限制,以及系统如何使用堆栈和在调用函数时注册
- 运行时可用于机器代码的函数符号列表 - 通常来自非常具体的库集
Android目前支持以下七种ABI:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64
arm64-v8a ,x86_64 这两个 ABI 应用并不是必须要做支持,手机一般都会提供自动兼容,像微信就是一个 armeabi打天下
在 Gradle 中配置应用支持的 ABI
ndk {
abiFilters "armeabi"
}
参考
https://developer.android.com/ndk/guides/abis?hl=zh-cn
https://blog.csdn.net/justFWD/article/details/49308199
Lint
啥是 Lint
Lint 在项目编译时会检查一些导致代码质量不佳的错误,比如 有个 layout 文件没有用到什么的
gradle 配置 Lint 提示
android {
lintOptions {
// true--关闭lint报告的分析进度
quiet true
// true--错误发生后停止gradle构建
abortOnError false
// true--只报告error
ignoreWarnings true
// true--忽略有错误的文件的全/绝对路径(默认是true)
//absolutePaths true
// true--检查所有问题点,包含其他默认关闭项
checkAllWarnings true
// true--所有warning当做error
warningsAsErrors true
// 关闭指定问题检查
disable 'TypographyFractions','TypographyQuotes'
// 打开指定问题检查
enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
// 仅检查指定问题
check 'NewApi', 'InlinedApi'
// true--error输出文件不包含源码行号
noLines true
// true--显示错误的所有发生位置,不截取
showAll true
// 回退lint设置(默认规则)
lintConfig file("default-lint.xml")
// true--生成txt格式报告(默认false)
textReport true
// 重定向输出;可以是文件或'stdout'
textOutput 'stdout'
// true--生成XML格式报告
xmlReport false
// 指定xml报告文档(默认lint-results.xml)
xmlOutput file("lint-report.xml")
// true--生成HTML报告(带问题解释,源码位置,等)
htmlReport true
// html报告可选路径(构建器默认是lint-results.html )
htmlOutput file("lint-report.html")
// true--所有正式版构建执行规则生成崩溃的lint检查,如果有崩溃问题将停止构建
checkReleaseBuilds true
// 在发布版本编译时检查(即使不包含lint目标),指定问题的规则生成崩溃
fatal 'NewApi', 'InlineApi'
// 指定问题的规则生成错误
error 'Wakelock', 'TextViewEdits'
// 指定问题的规则生成警告
warning 'ResourceAsColor'
// 忽略指定问题的规则(同关闭检查)
ignore 'TypographyQuotes'
}
}
参考
https://developer.android.com/studio/write/lint?hl=zh-cn
https://blog.csdn.net/berber78/article/details/60766091
dex 编译
啥是 dex
搞不懂 dex,就反编译玩过。大概查了一下,dex 对于 Davlik虚拟机, 就像 exe 对于 Windows一样吧。也就是 dex 编译 必然是 Android 编译的一部分咯
Gradle 配置 dex 编译
android {
dexOptions {
//是否开启增量编译, 当dex 对应的文件有修改的时候才去编译dex优化编译效率,这个功能 android studio 默认是关闭的,如果开启multi dex 此句无效
incremental false
//是否预加载 dex 库依赖项以加快您的增量构建速度
preDexLibraries = false
//是否忽略方法数限制的检查
jumboMode = false
//进行 dex 编译的进程所使用的最大栈内存,太小可能导致OOM而无法通过编译
javaMaxHeapSize "2048M"
}
}
参考
https://stackoverflow.com/questions/28927255/how-can-i-use-android-dexoptions
https://www.cnblogs.com/zhaoyanjun/p/5736305.html
https://stackoverflow.com/questions/33750404/android-gradle-what-is-javamaxheapsize-4g
packagingOptions(打包选项)
packagingOption的选项
简单翻译一下官方文档就理解了
First-pick
First-pick 选项对应的文件会被打包到 apk 中,如果有多个对应文件,只有第一个会被打包,其他的会被忽略
packagingOptions {
pickFirst "anyFileWillDo"
}
Merge
Merge 选项对应的文件会被合并到 apk 中。例如,当合并两个文件的时候,如果第一个文件的结尾不是换行符变会自动添加一个换行符,然后第二个文件的内容会被合并到第一个文件的末尾,这样就构成了合并后的文件
packagingOptions {
merge "/LICENSE.txt" // Same as: merges += ["/LICENSE.txt"]
}
Exclude
Exclude 选项对应的文件不会被编译到 apk 中
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
}
参考
productFlavors(打包特性)
用于多渠道打包
配置多渠道
在 Android Studio 3.0 中,需要加入 flavorDimensions
flavorDimensions "versionCode"
添加 demo 渠道
productFlavors {
demo {}
}
打包命令
打包 demo 渠道的 apk
./gradlew assembleGoogleRelease
打包所有渠道的 apk
./gradlew assembleRelease
参考
https://juejin.im/entry/577383c66be3ff006adc92a3
https://blog.csdn.net/mynameishuangshuai/article/details/51783303