一、Gradle构建的三大阶段
Gradle构建Android项目会经历三个核心阶段,每个阶段承担不同职责:
-
初始化阶段
- 读取
settings.gradle文件,确定项目包含哪些模块(如app模块、library模块)。 - 加载所有子模块的
build.gradle文件,构建项目模型。
- 读取
-
配置阶段
- 执行所有模块的
build.gradle文件中的配置代码。 - 解析依赖关系,构建任务依赖图(Task Graph)。例如,编译代码任务必须先于打包任务执行。
- 执行所有模块的
-
执行阶段
- 根据任务依赖图,按顺序执行任务。例如,执行
assembleDebug任务会触发编译、资源处理、APK生成等子任务。
- 根据任务依赖图,按顺序执行任务。例如,执行
二、Android插件的核心作用
com.android.application插件是构建Android应用的关键,它提供了以下核心能力:
-
构建类型(Build Types)
- Debug:快速构建,不压缩代码,使用调试签名,方便开发调试。
- Release:代码混淆、压缩,使用发布签名,生成最终APK。
-
产品风味(Product Flavors)
-
支持多渠道打包,例如:
groovy android { productFlavors { free { applicationId "com.example.app.free" } paid { applicationId "com.example.app.paid" } } }
-
-
变体(Variants)
- 组合构建类型和产品风味,生成最终构建产物。例如,
freeDebug、paidRelease。
- 组合构建类型和产品风味,生成最终构建产物。例如,
三、打包流程详解:从代码到APK
以assembleDebug任务为例,Gradle会按以下步骤构建APK:
-
编译代码
- 将Java/Kotlin代码编译为DEX文件(可执行字节码)。
- 使用
javac或kotlinc编译器,依赖compileSdkVersion指定的SDK版本。
-
处理资源
- 合并清单文件(
AndroidManifest.xml),处理依赖库的清单。 - 压缩图片、布局等资源,生成资源索引表(
resources.arsc)。
- 合并清单文件(
-
生成APK
- 将DEX文件、资源、清单文件打包为未签名的APK。
- 使用调试签名(
debug.keystore)对APK签名,生成最终文件。
-
输出路径
- 调试版APK:
app/build/outputs/apk/debug/app-debug.apk - 发布版APK:
app/build/outputs/apk/release/app-release.apk(需配置签名)
- 调试版APK:
四、关键配置文件解析
-
项目级
build.gradle-
定义全局依赖和插件版本:
groovy buildscript { repositories { google() // Google Maven仓库 mavenCentral() // Maven中央仓库 } dependencies { classpath 'com.android.tools.build:gradle:7.0.2' // AGP插件版本 } }
-
-
模块级
build.gradle-
配置模块专属参数:
groovy android { compileSdkVersion 33 // 编译使用的SDK版本 defaultConfig { applicationId "com.example.app" // 包名 minSdkVersion 21 // 最低支持Android版本 targetSdkVersion 33 // 目标版本 versionCode 1 // 版本号(整数) versionName "1.0" // 版本名称(字符串) } buildTypes { release { minifyEnabled true // 启用代码压缩 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation 'androidx.appcompat:appcompat:1.4.1' // 依赖库 }
-
五、自定义构建流程
通过Gradle的API,可以扩展构建流程以满足特定需求:
-
自定义任务
-
示例:生成版本信息类:
groovy task generateVersionClass { def outputDir = file("$buildDir/generated/source/version") outputs.dir outputDir doLast { def versionContent = "public class Version { public static final String CODE = ${versionCode}; }" file(outputDir, "Version.java").write(versionContent) } } // 将任务绑定到编译前 android.applicationVariants.all { variant -> variant.javaCompile.dependsOn(generateVersionClass) }
-
-
配置签名
-
发布版APK需配置签名:
groovy android { signingConfigs { release { storeFile file("keystore.jks") storePassword "store_password" keyAlias "key_alias" keyPassword "key_password" } } buildTypes { release { signingConfig signingConfigs.release } } }
-
六、优化构建速度
-
启用构建缓存
-
在
gradle.properties中添加:properties org.gradle.caching=true
-
-
并行执行
- 添加参数:
--parallel
- 添加参数:
-
使用国内镜像
-
修改仓库地址为阿里云镜像,加速依赖下载:
groovy repositories { maven { url 'https://maven.aliyun.com/repository/public' } }
-
七、常见命令
./gradlew assembleDebug:构建调试版APK。./gradlew assembleRelease:构建发布版APK(需配置签名)。./gradlew clean:清理构建缓存。./gradlew dependencies:查看依赖树。
通过以上流程,Gradle将源代码、资源、配置转化为可安装的APK文件,同时提供灵活的自定义能力,满足从开发到发布的完整需求。