Gradle
基本信息
Android Plugin DSL Reference | Building the Android Gradle Plugin
阿里库
https://maven.aliyun.com/mvn/view
https://maven.aliyun.com/repository/google
https://maven.aliyun.com/repository/public 包括jcenter和central
标准的 Gradle 项目结构
MyApp/
├── build.gradle
├── settings.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradle.properties
└── app
├── build.gradle
└── src
└── main
├── java
├── res
└── AndroidManifest.xml
多个Gradle Module
MyApp/
├── build.gradle
├── settings.gradle
├── app
│ ├── build.gradle
│ └── src
├── lib1
│ ├── build.gradle
│ └── src
└── lib2
├── build.gradle
└── src
settings.gradle 注册所有的 Module
include ':app', ':lib1', ':lib2'
在一个类里只能标注一个构造函数
gradle配置
忽略警告
packagingOptions {
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/DEPENDENCIES'
}
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
配置
packagingOptions
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
productFlavors(打包特性) 用于多渠道打包
配置多渠道
在 Android Studio 3.0 中,需要加入 flavorDimensions
flavorDimensions "versionCode"
添加 umeng 渠道
productFlavors {
umeng {}
}
打包命令
打包 umeng 渠道的 apk
./gradlew assembleUmengRelease
打包所有渠道的 apk
./gradlew assembleRelease
在 Gradle 中配置应用支持的 ABI
方法1
defaultConfig {
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86"
}
}
方法2
在build.gradle的android里添加如下内容
productFlavors {
need {
ndk {
abiFilters "arm64-v8a"
abiFilters "armeabi"
abiFilters "x86"
}
}
abiall {
ndk {
abiFilters "arm64-v8a"
abiFilters "armeabi-v7a"
abiFilters "armeabi"
abiFilters "x86"
abiFilters "x86_64"
}
}
}
生成apk的界面 Flavors 中
abiall
need
会分别生成app-abiall-release.apk和app-need-release.apk
配置 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'
}
}
配置 dex 编译
android {
dexOptions {
//是否开启增量编译, 当dex 对应的文件有修改的时候才去编译dex优化编译效率,这个功能 android studio 默认是关闭的,如果开启multi dex 此句无效
incremental false
//是否预加载 dex 库依赖项以加快您的增量构建速度
preDexLibraries = false
//是否忽略方法数限制的检查
jumboMode = false
//进行 dex 编译的进程所使用的最大栈内存,太小可能导致OOM而无法通过编译
javaMaxHeapSize "2048M"
}
}
禁止javadoc生成
How to remove or disable javadoc generation from project build?
在android任务同级目录添加 tasks.withType任务
android {
xxx
}
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
options.addStringOption('charSet', 'UTF-8')
}
支持 lambda
app build.gradle 中加入lambda支持,以前是要加个库,现在使用此方式
android {
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
}
添加依赖Module,Module中的buildTypes要和app中的对应
buildTypes {
// 正式环境
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
// 测试环境
beta {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
// 开发环境
debug {
minifyEnabled false //是否混淆,开发是选否
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
解决AndroidStudio编译慢、调试慢
build.gradle下配置
android {
dexOptions{
//最大堆内存
javaMaxHeapSize "8g"
//是否支持大工程模式
jumboMode = true
//预编译
preDexLibraries = true
//线程数
threadCount = 8
}
}
多渠道打包
在AndroidManifest.xml里设置动态渠道变量
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
在build.gradle设置productFlavors
假定我们需要打包的渠道为应用宝、360、小米、百度
android {
productFlavors {
yingyongbao {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
}
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
qh360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
}
或者批量修改
android {
productFlavors {
yingyongbao {}
xiaomi {}
qh360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
ProductFlavors其实就是可定义的产品特性,配合 manifest merger 使用的时候就可以达成在一次编译过程中产生多个具有自己特性配置的版本。上面这个配置的作用就是,为每个渠道包产生不同的 UMENG_CHANNEL_VALUE 的值。
执行打包操作
在AndroidStudio菜单栏点击Build菜单–>Generate signed APK–>选择key,并输入密码,然后下一步,选择打包渠道,Flavors里为各个渠道,点击完成。
执行打包命令 ./gradlew assembleRelease
除了使用AndroidStudio图形打包操作以外,我们也可以使用命令行进行打包操作
在AndroidStudio窗口左下角打开Terminal面板,输入gradlew assembleRelease命令
当我们的渠道包版本比较多时,可以自定义所打APK包名称,用以区分
android {
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// 自定义输出配置,这里我们加上APK版本号1.0
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为 appname_v1.0_wandoujia.apk
def fileName = "appname_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
productFlavors {
yingyongbao {}
xiaomi {}
qh360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
assemble是Gradle中的编译打包命令,有如下用法
想打包wandoujia渠道的release版本,执行
gradlew assembleWandoujiaRelease
想打包wandoujia渠道的debug版本,执行
gradlew assembleWandoujiaDebug
只打wandoujia渠道版本
gradlew assembleWandoujia
此命令会生成wandoujia渠道的Release和Debug版本
打全部Release版本
gradlew assembleRelease
打包配置签名时候signingConfigs代码块一定要写在buildTypes前面,否则会报下面这种错
Could not find property 'debugConfig' on SigningConfig container.
Gradle项目组织结构
settings.gradle 连接各个module 项目中的 build.gradle 用于配置依赖的来源 app中的 build.gradle 用于设置主module的配置
java工程控制台输出中文乱码
在build.gradle中配置
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
资料
Android studio 制作aar 使用Gradle发布项目到JCenter仓库
gradle build fails on lint task
使用Gradle管理你的Android Studio工程
Gradle Android插件用户指南翻译
Android Studio之gradle的配置与介绍
Gradle for Android 第三篇( 依赖管理 )
android--jenkins+gradle+android自动化构建apk步骤
Android应用开发编译框架流程与IDE及Gradle概要
Android Gradle 插件 8.13 版本说明
Gradle 提示与诀窍
android studio gradle 两种更新方法更新
Android多版本共存-基于gradle实现debug版和release版app共存
Android Gradle plugin API reference
gradle -P属性使用
gradle之gradlew最全指令攻略
gradle和gradlew的区别
Android studio gradle下载速度慢 下载失败解决方法(网址最全)
Android Studio 4.0 gradle-6.1.1-all.zip 下载速率太慢或失败解决办法
Android配置build.gradle的 productFlavors区分加载若干套不同代码资源后的默认加载项
Android Gradle配置快速入门
【关于flutter android build.gradle 文件中 Properties GradleException 报错 爆红解决方案】
gradle版本_十分钟搞定 Gradle
Gradle插件用户指南(译)
bintray-examples
Gradle Artifactory Plugin
快速搭建本地代码仓库并实现Gradle脚本发布
gradle 新的依赖方式 implementation、api、compileOnly
Gradle 插件 + ASM 实战——入门篇
Gradle实现资源文件的overlay
[Gradle中文教程系列]-跟我学Gradle-5.3:依赖-管理依赖的版本(传递(transitive)\排除(exclude)\强制(force)\动态版本(+))
AS--›Gradle 8.0/7.0.0/4.1.0/4.0/3.3/3.0 修改APK生成路径和文件名(附AAR修改方式以及分析过程)
gradle-5.1.1之大坑 -groovy-all:2.4.15