目录
plugin 插件引用
在 Gradle 构建脚本中,plugins 块用于声明和应用插件。插件可以扩展 Gradle 的功能,提供特定的任务和配置。例如,Android 插件、Java 插件、Kotlin 插件等。
基本语法
旧语法:
apply plugin: 'plugin-id'
新语法:Gradle 4.10 及更高版本推荐使用 plugins 块来应用插件,因为它提供了更好的插件版本管理和错误检查。
plugins {
id 'plugin-id' version 'plugin-version'
}
id:插件的标识符。
version:插件的版本号。
示例
Android应用插件
plugins {
id 'com.android.application' version '7.0.0'
}
应用application插件,这个插件提供了构建和打包 Android 应用所需的任务和配置。本声明表明gradle管理的模块将编译成Android应用。
Android库插件
plugins {
id 'com.android.library' version '7.0.0'
}
用于声明本gradle管理的模块将编译成Android aar 库。
Java插件
plugins {
id 'java'
}
Kotlin插件
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.5.21'
}
android块
用于配置 Android 项目,包括编译 SDK 版本、构建工具版本、默认配置和构建类型。
示例
android {
compileSdkVersion 33 // 指定编译时使用的 Android SDK 版本
buildToolsVersion "30.0.2" // 指定构建工具的版本
ndkPath System.getenv("ANDROID_NDK_HOME") // 通过系统环境变量获取ndk 路径
defaultConfig {
applicationId "com.example.myapp" // 用于指定 Android 应用的唯一标识符。这个标识符在整个应用的生命周期中保持不变,并且在应用发布到 Google Play 商店时也会使用。
minSdkVersion 28 // 指定应用的最低支持 SDK 版本
targetSdkVersion 33 // 指定应用的目标 SDK 版本
versionCode 1 // 指定应用的版本代码
versionName "1.0" // 指定应用的版本名称。
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // 指定用于运行测试的测试运行器
consumerProguardFiles "consumer-rules.pro" // 如果本gradle管理的模块编译成库,使用该项声明本库被使用时将按照 此ProGuard 文件定义的规则进行混淆
}
sourceSets { // 配置代码源路径
main {
java.srcDirs = ['src/main/java', 'src/main/aidl'] // 代码源文件
res.srcDirs = ['src/main/res'] // 资源源文件
aidl.srcDirs = ['../SDK/src/main/aidl'] // aidl源文件
assets.srcDirs = ['src/main/assets', 'src/main/ecc/output'] // 资产源文件
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
buildTypes { // 配置构建类型
release { // 发布构建类型
minifyEnabled false // 禁用代码混淆
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 指定 ProGuard 混淆文件
signingConfig signingConfigs.release // 使用 release 签名配置
}
debug { // 发布调试类型
minifyEnabled false // 禁用代码混淆
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 指定 ProGuard 混淆文件
}
}
signingConfigs { // 签名配置
release {
keyAlias 'platform'
}
}
// 用于配置 DEX 编译器的选项。DEX 编译器将 Java 字节码转换为 Android 可执行文件(DEX 文件),这些文件可以在 Android 设备上运行。通过配置 dexOptions,你可以优化 DEX 编译过程,控制内存使用,添加额外的编译参数等。
dexOptions {
preDexLibraries = false // 是否在构建过程中预先编译库。设置为 false 可以在某些情况下减少构建时间,特别是在增量构建时。
additionalParameters = ['--core-library'] // 传递给 DEX 编译器的额外参数。在这个例子中,--core-library 参数允许使用核心库的类。
javaMaxHeapSize "6144m" // 设置 DEX 编译器的最大堆内存大小。在这个例子dexOptions 块用于配置 DEX 编译器的选项。DEX 编译器将 Java 字节码转换为 Android 可执行文件(DEX 文件),这些文件可以在 Android 设备上运行。通过配置 dexOptions,你可以优化 DEX 编译过程,控制内存使用,添加额外的编译参数等。增加堆内存大小可以在处理大型项目时避免内存不足错误。
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 // 指定源代码的兼容性版本。即,编译器将按照这个版本的 Java 语法和 API 来编译源代码,源代码将按照 Java 1.8 的语法和 API 编译。
targetCompatibility JavaVersion.VERSION_1_8 // 指定生成的字节码的兼容性版本。即,编译器将生成与这个版本的 Java 虚拟机(JVM)兼容的字节码,生成的字节码将与 Java 1.8 兼容。
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies 块
在 Gradle 构建脚本中,dependencies 块用于声明项目的依赖项。依赖项可以是本地文件、远程库、其他项目模块等。通过声明依赖项,Gradle 会自动下载和管理这些库,使其在编译和运行时可用。
依赖项类型
implementation:编译时和运行时依赖项,推荐用于大多数情况。
api:编译时和运行时依赖项,且会暴露给依赖此模块的其他模块。
compileOnly:仅在编译时可用,运行时不可用。
runtimeOnly:仅在运行时可用,编译时不可用。
testImplementation:仅在测试编译和运行时可用。
androidTestImplementation:仅在 Android 仪器测试编译和运行时可用。
示例
dependencies {
// 编译时和运行时依赖项
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.code.gson:gson:2.8.8'
// 仅在编译时可用
compileOnly 'org.projectlombok:lombok:1.18.20'
// 仅在运行时可用
runtimeOnly 'org.postgresql:postgresql:42.2.20'
// 测试编译和运行时依赖项
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:3.11.2'
// Android 仪器测试依赖项
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
// 本地文件依赖项
implementation files('libs/some-local-lib.jar')
// 本地jar包或者aar依赖项
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
// 项目模块依赖项
implementation project(':some-other-module')
// 仅在编译时可用的本地文件
compileOnly files(project.bundleDir + '/magic-system/magic-system/magic-system_apis-36/libs/magic-system.jar')
}
注意事项
依赖冲突:如果不同的依赖项之间存在版本冲突,Gradle 会尝试解决冲突,但有时需要手动指定版本。
依赖管理:可以使用 implementation 和 api 来管理依赖项的可见性,implementation 依赖项不会暴露给依赖此模块的其他模块,而 api 依赖项会暴露。
本地文件:使用 files 方法可以添加本地文件作为依赖项,但建议尽量使用远程库,以便于依赖管理和版本控制。
混淆
consumerProguardFiles 是 Gradle 构建脚本中的一个配置项,用于指定 ProGuard 配置文件,这些文件将在库模块被消费时应用。也就是说,当你的库被其他应用或库依赖时,这些 ProGuard 规则将被应用到最终的应用程序中。
作用
保护库代码:通过混淆和优化,保护库代码不被反编译。
保持必要的类和方法:确保库中的某些类和方法在混淆过程中不会被移除或重命名,以保证库的正常运行。
解析
-
consumerProguardFiles “consumer-rules.pro”:
指定一个 ProGuard 配置文件 consumer-rules.pro,该文件中的规则将在库被消费时应用。 -
proguardFiles getDefaultProguardFile(‘proguard-android-optimize.txt’), ‘proguard-rules.pro’:
在 release 构建类型中,指定 ProGuard 配置文件用于代码混淆和优化。
getDefaultProguardFile(‘proguard-android-optimize.txt’):使用 Android 提供的默认 ProGuard 配置文件。
‘proguard-rules.pro’:使用自定义的 ProGuard 配置文件。
consumer-rules.pro 示例
# 保持所有公共类和方法
-keep public class * {
public *;
}
# 保持特定的类和方法
-keep class com.example.mylibrary.MyClass {
public void myMethod();
}
# 混淆库中的所有类和方法
-obfuscate
签名配置
signingConfigs 块用于配置 Android 应用的签名信息。签名是 Android 应用发布和安装的必要步骤。每个 Android 应用在发布之前都需要使用一个密钥进行签名,以确保应用的完整性和来源的可信度。
语法
android {
...
signingConfigs {
release {
keyAlias 'platform'
keyPassword 'your_key_password'
storeFile file('path/to/your/keystore.jks')
storePassword 'your_store_password'
}
}
...
}
解释:
signingConfigs:用于定义签名配置。
release:定义一个名为 release 的签名配置。
keyAlias:密钥别名,用于标识密钥库中的特定密钥。
keyPassword:密钥密码,用于访问密钥。
storeFile:密钥库文件的位置。
storePassword:密钥库密码,用于访问密钥库。
注意事项
安全性:不要将密钥密码和密钥库文件路径硬编码在 build.gradle 文件中。可以使用环境变量或 Gradle 属性文件来管理这些敏感信息。
密钥库文件:确保密钥库文件路径正确,并且文件存在。
签名配置:在 buildTypes 块中,使用 signingConfig 指定要使用的签名配置。
使用环境变量
signingConfigs {
release {
keyAlias System.getenv('KEY_ALIAS')
keyPassword System.getenv('KEY_PASSWORD')
storeFile file(System.getenv('STORE_FILE'))
storePassword System.getenv('STORE_PASSWORD')
}
}
使用Gradle属性文件
在项目根目录下创建一个 gradle.properties 文件,并添加以下内容:
KEY_ALIAS=platform
KEY_PASSWORD=your_key_password
STORE_FILE=path/to/your/keystore.jks
STORE_PASSWORD=your_store_password
然后在 build.gradle 文件中使用这些属性:
signingConfigs {
release {
keyAlias project.KEY_ALIAS
keyPassword project.KEY_PASSWORD
storeFile file(project.STORE_FILE)
storePassword project.STORE_PASSWORD
}
}