Gradle的环境配置

Gradle的环境配置

原文地址:https://www.cnblogs.com/baiqiantao/p/6890674.html

Installing Gradle: https://docs.gradle.org/current/userguide/installation.html

  • gradlew 和 gradlew.bat:封装 gradle 的脚本,目的是为了更方便的使用 gradle
  • 环境变量 GRADLE_HOME:仅仅是为了可以在任意目录中执行 gradle 命令,没有特殊的意义
  • 环境变量 GRADLE_USER_HOME:控制在命令行中执行 gradlew 命令时,gradle 下载的目录
  • IDEA 的 Gradle user home:控制在 IDEA 点击按钮执行各项 Task 等功能时,gradle 下载的目录
  • IDEA 的 User from gradle:控制在 IDEA 点击按钮执行各项 Task 等功能时,使用的 gradle 的版本

环境变量 GRADLE_HOME

设置环境变量 GRADLE_HOME 的目的,仅仅是为了方便在 Path 中指定 gradle 的位置。
GRADLE_HOME:D:_dev\gradle_GRADLE_HOME\gradle-6.7
Path:%GRADLE_HOME%\bin
将 gradle 添加到 Path 的目的是为了,可以在任意目录中执行 gradle 命令。
实际上,完全没必要设置环境变量 GRADLE_HOME,Do we really need GRADLE_HOME?

1
2
3
4
5
6
gradle -v           # 查看版本
gradle --help # 查看命令使用帮助

λ where gradle # 查看 gradle 命令位置
D:\_dev\gradle\GRADLE_HOME\gradle-6.7\bin\gradle
D:\_dev\gradle\GRADLE_HOME\gradle-6.7\bin\gradle.bat

gradlew 是干嘛的

其实 gradlew 只是一个 gradle 的封装(wrapper),gradlew = gradle wrapper,因为在项目根目录有 gradlewgradlew.bat 这两个可执行文件,所以 能且仅能 在项目根目录中执行 gradlew 命令。

1
2
3
4
5
6
D:\_dev\_code\as\Test> gradlew -v       # 查看版本
D:\_dev\_code\as\Test> gradlew --help # 查看命令使用帮助

D:\_dev\_code\as\Test> where gradlew # 查看 gradlew 命令位置
D:\_dev\_code\as\Test\gradlew
D:\_dev\_code\as\Test\gradlew.bat

这两个文件头部的注释也说明了他们的作用:

  • gradlew:Gradle start up script for UN*X
  • gradlew.bat:Gradle startup script for Windows

之所以添加这个 gradlew 脚本,是为了:

统一项目所使用的 gradle 版本,避免不同开发人员使用不同的 gradle 版本导致的兼容性问题
可以把 gradle-wrapper.properties 里面的下载 gradle 的地址切换到公司的公共空间上,以加快下载速度

1
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip

环境变量 GRADLE_USER_HOME

设置环境变量 GRADLE_USER_HOME 的目的,是为了自定义下载 gradle 时的本地存储路径。
在命令行中执行 gradlew 命令(注意不是 gradle 命令)时,会将对应版本的 gradle 下载到此目录中。
下载 gradle 时,下载地址及版本由项目中的 /gradle/wrapper/gradle-wrapper.properties 决定。

1
2
3
4
5
6
#Mon Nov 16 00:55:48 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip

IDEA 的 Gradle user home

在 IDEA 的 File | Settings | Build, Execution, Deployment | Build Tools | Gradle 中,有一个 Gradle user home 的配置,其作用和环境变量 GRADLE_USER_HOME 类似,只不过该配置只是给 IDEA 使用的。譬如点击 gradle 窗口的各种 Task 按钮执行各项 Task 功能时。

注意:仅 IDEA 中的各种图形化操作会使用此配置,在 IDEA 的 Terminal 中执行 gradlew 命令时,使用的依旧是环境变量 GRADLE_USER_HOME

IDEA 的 User from gradle

在 IDEA 的 File | Settings | Build, Execution, Deployment | Build Tools | Gradle 中,有一个 User from gradle 的配置,它也是仅提供给 IDEA 使用的(对 gradlew 无效)。

其作用是,指定当前工程中 IDEA 所使用的 gradle 版本:

当勾选 gradle-wrapper.properties 时,使用 gradle-wrapper.properties 中指定的 gradle 版本。
为了防止和在 Terminal 中执行 gradlew 命令时使用的 gradle 版本不同,建议勾选此配置(也是默认配置)。
当勾选 Specified location 时,使用指定目录下的 gradle 版本。
如果 gradle 下载很慢,就可以勾选此配置,以便使用指定本地下载好的 gradle 版本。

不管在 IDEA 中怎么配置,在 Terminal 中执行 gradlew 命令时,所使用的 gradle 版本都是由 gradle-wrapper.properties 决定的,并且下载路径也都是由环境变量 GRADLE_USER_HOME 决定的。

org.gradle.java.home 配置

这里的 JDK 指的是执行 Gradle 命令依赖的 JDK,并非 AndroidStudio 工程依赖的 JDK。

通过 File | Settings | Build, Execution, Deployment | Build Tools | Gradle 设置的 JDK,是在运行 IDEA 图形化按钮时使用的。
通过 gradle.properties 设置的 JDK,是在 Terminal 中执行 gradlew 命令时使用的。

1
2
3
4
5
6
# MacOS的路径写法
org.gradle.java.home=/Applications/Android Studio.app/Contents/jbr/Contents/Home

# Windows系统的路径写法参考如下
# org.gradle.java.home=C:\\Program Files\\Java\\jdk1.8.0_144
# org.gradle.java.home=C\:/_dev/Android/Android Studio/jre

注意:AGP 从 7.0.0-alpha02 版本起,需要使用 Java 11

Gradle配置构建多Module项目

Gradle配置构建多Module项目

0x01 配置远程代码库

可以按如下方式声明特定的 Maven 或 Ivy 代码库:

1
2
3
4
5
6
7
8
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public' } // public仓是包含central仓和jcenter仓的聚合仓
maven { url 'https://maven.aliyun.com/repository/google' } // 阿里镜像库
maven { url "file://local/repo/" } // 本地文件代码库
ivy { url "https://repo.example.com/ivy" } // Ivy代码库
}
}

0x02 统一配置Gradle依赖库版本

随着项目采用模块化,组件化开发,moudle 的个数也会随着增加,统一管理配置gradle就显得比较重要了。

1、在 project 根目录创建一个 config.gradle 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ext {  
// app 相关版本控制
versions = [
compileVersion : 26,
buildVersion : "26.0.2",

sdkMinVersion : 15,
sdkTargetVersion : 26,
appVersionCode : 520,
appVersionName : "1.0.0"
]
// support依赖
support = [
appcompat : "com.android.support:appcompat-v7:26.+",
recyclerview: "com.android.support:recyclerview-v7:26.+"
]
// 依赖
deps = [
glide : "com.github.bumptech.glide:glide:4.11.0"
]
}

2、在 Project 根目录下的 build.gradle 添加apply

1
apply from: 'config.gradle' 

3、在相应Moudle中调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
android {  
def versions = rootProject.ext.versions
compileSdkVersion versions.compileVersion
buildToolsVersion versions.buildVersion
defaultConfig {
applicationId "com.dench.wanandroid"
minSdkVersion versions.sdkMinVersion
targetSdkVersion versions.sdkTargetVersion
versionCode versions.appVersionCode
versionName versions.appVersionName
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
def dependencies = rootProject.ext.deps
def support = rootProject.ext.support

implementation support.appcompat
implementation support.recyclerview
implementation dependencies.glide
}

0x03 配置Flavor

创建产品变种与创建构建类型类似:将其添加到构建配置中的 productFlavors 代码块并添加所需的设置。产品变种支持与 defaultConfig 相同的属性,这是因为,defaultConfig 实际上属于 ProductFlavor 类。这意味着,您可以在 defaultConfig 代码块中提供所有变种的基本配置,每个变种均可更改其中任何默认值,如 applicationId

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
android {
defaultConfig {...}
buildTypes {
debug{...}
release{...}
}
// Specifies one flavor dimension.
flavorDimensions "version"
productFlavors {
demo {
dimension "version"
applicationIdSuffix ".demo"
versionNameSuffix "-demo"
versionCode 30000 + android.defaultConfig.versionCode
}
full {
dimension "version"
applicationIdSuffix ".full"
versionNameSuffix "-full"
versionCode 20000 + android.defaultConfig.versionCode
}
}
}

0x04 创建源代码集

1、Gradle 要求:

在所有构建变体之间共享的所有内容创建 main/ 源代码集和目录。

将“debug”构建类型特有的 Java 类文件放在 src/debug/java/ 目录中。

1
2
3
4
5
6
7
8
9
10
11
12
13
debug
----
Compile configuration: compile
build.gradle name: android.sourceSets.debug
Java sources: [app/src/debug/java]
Manifest file: app/src/debug/AndroidManifest.xml
Android resources: [app/src/debug/res]
Assets: [app/src/debug/assets]
AIDL sources: [app/src/debug/aidl]
RenderScript sources: [app/src/debug/rs]
JNI sources: [app/src/debug/jni]
JNI libraries: [app/src/debug/jniLibs]
Java-style resources: [app/src/debug/resources]

依次转到 MyApplication > Tasks > android,然后双击 sourceSets。Gradle 执行该任务后,系统应该会打开 Run 窗口以显示输出。

2、更改默认源代码集配置

1
2
3
4
5
6
7
8
9
android {
sourceSets {
main {
java.srcDirs = ['other/java']
res.srcDirs = ['other/res1', 'other/res2']
manifest.srcFile 'other/AndroidManifest.xml'
}
}
}

0x05 声明依赖项

1
2
3
4
5
6
dependencies {
// Adds the local "mylibrary" module as a dependency to the "free" flavor.
freeImplementation project(":mylibrary")
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

0x06 配置签名

1、在项目的根目录下创建一个名为 keystore.properties 的文件,并使其包含以下信息:

1
2
3
4
storePassword=myStorePassword
keyPassword=myKeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

2、在 build.gradle 文件中,按如下方式加载 keystore.properties 文件(必须在 android 代码块前面):

1
2
3
4
5
6
7
8

def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
// before android
android {

}

3、输入存储在 keystoreProperties 对象中的签名信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
android {
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}

如需从环境变量获取这些密码,请添加以下代码:

1
2
storePassword System.getenv("KSTOREPWD")
keyPassword System.getenv("KEYPWD")

0x07 apk重命名

1
2
3
4
5
6
7
8
9
android {
applicationVariants.all { variant ->
if (variant.buildType.name == 'release') {
variant.outputs.all {
outputFileName = "app_v${variant.versionName}.${buildTime}_${variant.productFlavors[0].name}_${variant.buildType.name}.apk"
}
}
}
}

or

1
2
3
outputFileName = "app_v${versionName}.${buildTime}_${flavorName}_${buildType.name}.apk"
outputFileName = "../../${outputFileName}"
println outputFileName

0x08 将构建变量注入清单

1、如果您需要将变量插入在 build.gradle 文件中定义的 AndroidManifest.xml 文件,可以使用 manifestPlaceholders 属性执行此操作。此属性采用键值对的映射,如下所示:

1
2
3
4
5
6
android {
defaultConfig {
manifestPlaceholders = [hostName:"www.example.com"]
applicationId "com.example.myapp"
}
}

2、您可以将某个占位符作为属性值插入清单文件,如下所示:

1
2
3
4
<intent-filter ... >
<data android:scheme="http" android:host="${hostName}" ... />
<action android:name="${applicationId}.TRANSMOGRIFY" />
</intent-filter>

0x09 gradle自定义Java变量和资源值

在构建时,Gradle 将生成 BuildConfig 类,以便应用代码可以检查与当前构建有关的信息。您也可以从 Gradle 构建配置文件中使用 buildConfigField() 方法将自定义字段添加到 BuildConfig 类中,然后在应用的运行时代码中访问这些值。同样,您也可以使用 resValue() 添加应用资源值。

1
2
3
4
5
6
7
8
9
10
11
12
13
def buildTime = new Data().format("yyyyMMddHHmm", TimeZone.getTimeZone("GTM+08:00"))
android {
buildTypes {
release {
buildConfigField("String", "BUILD_TIME", "\"${buildTime}\"")
resValue("string", "build_time", "${buildTime}")
}
debug {
buildConfigField("String", "BUILD_TIME", "\"0\"")
resValue("string", "build_time", "0")
}
}
}

在应用代码中,您可以按如下方式访问属性:

1
2
Log.i(TAG, BuildConfig.BUILD_TIME);
Log.i(TAG, getString(R.string.build_time));

0x10 设定编码

1
2
3
4
5
allprojects {
tasks.withType(JavaCompile){
options.encoding = "UTF-8"
}
}

Gradle常用命令

Gradle 常用命令

0x01 快速构建命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 查看构建版本
./gradlew -v

# 清除build文件夹
./gradlew clean

# 检查依赖并编译打包
./gradlew build

# 编译并安装debug包
./gradlew installDebug

# 编译并打印日志
./gradlew build --info

# 译并输出性能报告,性能报告一般在 构建工程根目录 build/reports/profile
./gradlew build --profile

# 调试模式构建并打印堆栈日志
./gradlew build --info --debug --stacktrace

# 离线模式
./gradlew aDR --offline

# 守护进程
./gradlew build --daemon

# 并行编译模式
./gradlew build --parallel --parallel-threads=N

0x02 构建并安装命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 编译并打Debug包
./gradlew assembleDebug

# 这个是简写 assembleDebug
./gradlew aD

# 编译并打Release的包
./gradlew assembleRelease

# 这个是简写 assembleRelease
./gradlew aR

# Debug模式打包并安装
./gradlew install app:assembleDebug

# Release模式打包并安装
./gradlew installRelease

# 卸载Release模式包
./gradlew uninstallRelease

# Flavor渠道包
./gradlew install app:assemble<Flavor>Debug

0x03 查看包依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
./gradlew dependencies

# 查看app模块依赖
./gradlew app:dependencies

# 检索依赖库
./gradlew app:dependencies | grep CompileClasspath

# windows 没有 grep 命令
./gradlew app:dependencies | findstr "CompileClasspath"

# 将检索到的依赖分组找到 比如flavorDebugCompileClasspath就是flavor渠道分发的开发编译依赖
./gradlew app:dependencies --configuration <flavor>DebugCompileClasspath

# 依赖树过长可以保存到本地文件方便查看
./gradlew app:dependencies --configuration <flavor>DebugCompileClasspath >1.log

0x04 依赖包更新

1
2
3
4
5
# 依赖包更新命令
./gradlew build --refresh-dependencies

# 强制更新最新依赖,清除构建并构建
./gradlew clean build --refresh-dependencies
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×