前言
Android的Gradle是每个项目一定包含的文件,用来定义构建配置的脚本文件,通常包括两个主要文件:build.gradle
(项目级别)和build.gradle
(模块级别)。
项目级别的 build.gradle
文件
项目级别的 build.gradle
文件位于项目的根目录,通常包括全局配置、插件和依赖管理等内容。
Groovy
// 项目级别的 build.gradle 文件
buildscript {
// 构建脚本的仓库配置
repositories {
google()
mavenCentral()
}
// 构建脚本的依赖配置
dependencies {
}
}
// 所有项目的通用配置
allprojects {
// 通用的仓库配置
repositories {
google()
mavenCentral()
}
}
// 任务定义
task clean(type: Delete) {
delete rootProject.buildDir
}
-
buildscript:
- repositories :指定构建脚本的仓库,如
google()
和mavenCentral()
。 - dependencies:定义构建脚本所需的依赖,如 Android Gradle 插件和 Kotlin Gradle 插件。
- repositories :指定构建脚本的仓库,如
-
allprojects:
- repositories:为所有模块指定公共的仓库。
-
task clean:
- 定义清理任务,用于删除项目的构建目录。
模块级别的 build.gradle
文件
模块级别的 build.gradle
文件位于每个模块(如 app
)的目录下,定义具体模块的构建配置和依赖关系。
Groovy
// 模块级别的 build.gradle 文件
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
// debug 配置
}
}
flavorDimensions "version"
productFlavors {
free {
dimension "version"
applicationIdSuffix ".free"
versionNameSuffix "-free"
}
paid {
dimension "version"
applicationIdSuffix ".paid"
versionNameSuffix "-paid"
}
}
}
dependencies {
}
-
plugins:
- 定义该模块使用的插件,如
com.android.application
和kotlin-android
。
- 定义该模块使用的插件,如
-
android:
- compileSdkVersion:指定编译时使用的 SDK 版本。
- defaultConfig :定义默认的配置,包括
applicationId
、minSdkVersion
、targetSdkVersion
、versionCode
和versionName
。 - buildTypes :定义构建类型,如
release
和debug
,可以配置是否启用代码压缩(Proguard)。 - flavorDimensions 和 productFlavors:用于配置多种产品风格(flavors),如免费版和付费版。
-
dependencies:
- 列出该模块的依赖库,如 Kotlin 标准库、AndroidX 库、JUnit 等。
全局配置:
- 在项目级别的
build.gradle
文件中,通过buildscript
块定义构建脚本所需的仓库和依赖,例如 Android Gradle 插件和 Kotlin Gradle 插件。 allprojects
块定义了所有模块通用的仓库,例如google()
和mavenCentral()
,这些仓库配置会被所有模块共享。- 项目级别的
build.gradle
文件中定义了全局任务,例如clean
任务,用于删除项目的构建目录。这个任务可以在根项目中执行,影响所有模块。
模块配置:
- 每个模块有自己的
build.gradle
文件,定义具体的构建配置,例如compileSdkVersion
、defaultConfig
、buildTypes
、flavorDimensions
和productFlavors
。 - 模块级别的文件中还定义了模块的依赖关系,例如 Kotlin 标准库、AndroidX 库等。
- 通过在模块级别的
build.gradle
文件中定义flavorDimensions
和productFlavors
,可以生成不同的构建变体。例如,通过组合free
和paid
这两个productFlavors
,可以生成免费版和付费版的应用。
项目划分成模块
一个电商应用,可以划分成如下模块:
App 模块(主模块)Network 模块(网络模块)Database 模块(数据库模块)
User 模块(用户模块)Product 模块(产品模块)Cart 模块(购物车模块)
Payment 模块(支付模块)
此时,利用settings.gradle文件在 Android 项目中用于定义项目的结构和包含的模块,告诉 Gradle 该项目包含哪些模块以及如何组织这些模块。
Groovy
// settings.gradle 文件
// 项目根目录名称
rootProject.name = 'MyApplication'
include ':app'
include ':network'
include ':database'
include ':user'
include ':product'
include ':cart'
include ':payment'
同时,在APP模块的dependencies块中包含其他模块即可把其他模块作为依赖添加到项目
Groovy
dependencies {
implementation project(':network')
implementation project(':database')
implementation project(':user')
}
同一模块打包成不同的应用apk
通过构建变体可以实现 使用相同的模块打包出不同的应用(APK)。构建变体结合了 构建类型 (Build Types)和 产品风格(Product Flavors),允许创建不同版本的应用,比如免费版和付费版、调试版和发布版等。
Groovy
buildTypes {
debug {
// 调试版配置
applicationIdSuffix ".debug"
versionNameSuffix "-debug"
minifyEnabled false
}
release {
// 发布版配置
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
Groovy
productFlavors {
free {
dimension "version"
applicationIdSuffix ".free"
versionNameSuffix "-free"
}
paid {
dimension "version"
applicationIdSuffix ".paid"
versionNameSuffix "-paid"
}
}
与此同时,在gradle里面使用buildConfigField字段,可以在代码中使用条件编译来根据构建变体选择性地包含代码片段。
gradle中
Groovy
android {
...
buildTypes {
debug {
buildConfigField "String", "ENVIRONMENT", "\"development\""
}
release {
buildConfigField "String", "ENVIRONMENT", "\"production\""
}
}
productFlavors {
free {
buildConfigField "boolean", "IS_FREE_VERSION", "true"
}
paid {
buildConfigField "boolean", "IS_FREE_VERSION", "false"
}
}
}
代码中
Groovy
if (BuildConfig.IS_FREE_VERSION) {
// Free version specific code
} else {
// Paid version specific code
}
String environment = BuildConfig.ENVIRONMENT;