Open ChenViVi opened 6 years ago
关于 Gradle 的使用,最多的操作就是导库,顶多也就配置过自动签名,因为实战上没这个需求自己也不太主动学。我一向都是用什么学什么,只要我需要做一个东西,跨技术甚至跨领域都没关系。可能今天想做 Android 程序后天就觉得有个想法需要学建站技术才能实现,然后打游戏需要 记 BOSS 技能 CD 时间又做了个桌面定时软件,我甚至接触过编曲。但是如果我不需要做的功能,可能就瞟一眼完事,不会去深入理解,超懒
发现了个官方文档:https://google.github.io/android-gradle-dsl/current/index.html
另外,Gradle 编译默认不是多线程的
我甚至都不知道这个东西的专有名词是叫 ABI
ABI 是 Application Binary Interface 的缩写
典型的 ABI 包含以下信息:
Android目前支持以下七种ABI:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64
arm64-v8a ,x86_64 这两个 ABI 应用并不是必须要做支持,手机一般都会提供自动兼容,像微信就是一个 armeabi打天下
ndk { abiFilters "armeabi" }
https://developer.android.com/ndk/guides/abis?hl=zh-cn
https://blog.csdn.net/justFWD/article/details/49308199
Lint 在项目编译时会检查一些导致代码质量不佳的错误,比如 有个 layout 文件没有用到什么的
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 对于 Davlik虚拟机, 就像 exe 对于 Windows一样吧。也就是 dex 编译 必然是 Android 编译的一部分咯
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/26779552/what-does-the-incremental-dex-option-in-android-studio-do
https://stackoverflow.com/questions/33750404/android-gradle-what-is-javamaxheapsize-4g
简单翻译一下官方文档就理解了
First-pick 选项对应的文件会被打包到 apk 中,如果有多个对应文件,只有第一个会被打包,其他的会被忽略
packagingOptions { pickFirst "anyFileWillDo" }
Merge 选项对应的文件会被合并到 apk 中。例如,当合并两个文件的时候,如果第一个文件的结尾不是换行符变会自动添加一个换行符,然后第二个文件的内容会被合并到第一个文件的末尾,这样就构成了合并后的文件
packagingOptions { merge "/LICENSE.txt" // Same as: merges += ["/LICENSE.txt"] }
Exclude 选项对应的文件不会被编译到 apk 中
packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE' exclude 'META-INF/NOTICE.txt' }
https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html
用于多渠道打包
在 Android Studio 3.0 中,需要加入 flavorDimensions
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
https://blog.csdn.net/SYIF88/article/details/75009663
记一些以前不知道的 Gradle 配置
前言
关于 Gradle 的使用,最多的操作就是导库,顶多也就配置过自动签名,因为实战上没这个需求自己也不太主动学。我一向都是用什么学什么,只要我需要做一个东西,跨技术甚至跨领域都没关系。可能今天想做 Android 程序后天就觉得有个想法需要学建站技术才能实现,然后打游戏需要 记 BOSS 技能 CD 时间又做了个桌面定时软件,我甚至接触过编曲。但是如果我不需要做的功能,可能就瞟一眼完事,不会去深入理解,超懒
发现了个官方文档:https://google.github.io/android-gradle-dsl/current/index.html
另外,Gradle 编译默认不是多线程的
ABI 管理
我甚至都不知道这个东西的专有名词是叫 ABI
啥是 ABI
ABI 是 Application Binary Interface 的缩写
典型的 ABI 包含以下信息:
Android目前支持以下七种ABI:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64
arm64-v8a ,x86_64 这两个 ABI 应用并不是必须要做支持,手机一般都会提供自动兼容,像微信就是一个 armeabi打天下
在 Gradle 中配置应用支持的 ABI
参考
https://developer.android.com/ndk/guides/abis?hl=zh-cn
https://blog.csdn.net/justFWD/article/details/49308199
Lint
啥是 Lint
Lint 在项目编译时会检查一些导致代码质量不佳的错误,比如 有个 layout 文件没有用到什么的
gradle 配置 Lint 提示
参考
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 编译
参考
https://stackoverflow.com/questions/28927255/how-can-i-use-android-dexoptions
https://www.cnblogs.com/zhaoyanjun/p/5736305.html
https://stackoverflow.com/questions/26779552/what-does-the-incremental-dex-option-in-android-studio-do
https://stackoverflow.com/questions/33750404/android-gradle-what-is-javamaxheapsize-4g
packagingOptions(打包选项)
packagingOption的选项
简单翻译一下官方文档就理解了
First-pick
First-pick 选项对应的文件会被打包到 apk 中,如果有多个对应文件,只有第一个会被打包,其他的会被忽略
Merge
Merge 选项对应的文件会被合并到 apk 中。例如,当合并两个文件的时候,如果第一个文件的结尾不是换行符变会自动添加一个换行符,然后第二个文件的内容会被合并到第一个文件的末尾,这样就构成了合并后的文件
Exclude
Exclude 选项对应的文件不会被编译到 apk 中
参考
https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html
productFlavors(打包特性)
用于多渠道打包
配置多渠道
在 Android Studio 3.0 中,需要加入
flavorDimensions
添加 demo 渠道
打包命令
打包 demo 渠道的 apk
打包所有渠道的 apk
参考
https://juejin.im/entry/577383c66be3ff006adc92a3
https://blog.csdn.net/mynameishuangshuai/article/details/51783303
https://blog.csdn.net/SYIF88/article/details/75009663