AGP 是 Android Gradle Plugin(Android Gradle 插件) 的缩写,它是 Google 官方为 Android 项目提供的 Gradle 构建插件,用于将标准的 Gradle 构建系统适配到 Android 应用的编译、打包、测试等流程中。
AGP 在项目中的位置
在build.gradle文件中体现:
1. 项目级 build.gradle(声明 AGP 版本)
// build.gradle (Project)
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:8.5.0' // ← 这就是 AGP
}
}或使用现代插件 DSL(推荐):
// build.gradle.kts (Project)
plugins {
id("com.android.application") version "8.5.0" apply false
id("org.jetbrains.kotlin.android") version "1.9.20" apply false
}2. 模块级 build.gradle(应用 AGP 插件)
// app/build.gradle
plugins {
id 'com.android.application' // ← 应用 AGP 的 application 插件
}或者老式写法:
apply plugin: 'com.android.application'AGP 提供的主要插件类型
| 插件 ID | 用途 |
|---|---|
com.android.application | 构建 Android 应用(生成 APK/AAB) |
com.android.library | 构建 Android 库(AAR) |
com.android.test | 测试模块(已弃用) |
com.android.dynamic-feature | 动态功能模块(用于 Play Feature Delivery) |
AGP 与 Gradle、Android Studio 的关系
| 组件 | 作用 | 依赖关系 |
|---|---|---|
| Gradle | 通用构建工具(执行 task、依赖管理) | 基础 |
| AGP | 在 Gradle 上扩展 Android 构建能力 | 依赖特定版本的 Gradle |
| Android Studio | IDE,调用 Gradle + AGP 进行 Sync/Build | 依赖兼容的 AGP + Gradle 版本 |
版本必须匹配:
每个 AGP 版本只支持特定范围的 Gradle 版本。
例如:
- AGP 8.5.x → 需要 Gradle 8.6+
- AGP 8.0.x → 需要 Gradle 8.2+
官方兼容性表格:\ https://developer.android.com/build/releases/gradle-plugin#compatibility
AGP 的核心配置块(在android {}中)
在模块级build.gradle中,会看到:
android {
compileSdk 34
namespace "com.example.app"
defaultConfig {
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
buildFeatures {
viewBinding true
compose true
}
}这些配置都是由 AGP 解析并驱动构建流程的。
AGP 的重要演进(近年亮点)
| 版本 | 重要特性 |
|---|---|
| AGP 7.0+ | + 强制使用namespace替代AndroidManifest.xml中的 package+ 移除 compile依赖配置 |
| AGP 8.0+ | + 默认启用 R8 全程序优化 + 改进增量编译 + 支持 Kotlin K2 编译器(实验性) |
| AGP 8.2+ | + 改进 lint 性能; + 支持 JDK 21 |
| AGP 8.5+(最新稳定) | + 更快的构建速度; + 更好的 Compose 编译支持; + 增强隐私沙盒工具 |
常见问题
Q:Gradle、Gradlew 以及 AGP 有什么关系?有什么区别?
A:这三者构成了 Android 项目的构建流水线。
- Gradle:一个通用的构建工具。它不只为 Android 服务,Java、Kotlin、C++ 甚至 iOS 项目都能用它。它负责管理依赖、运行任务(Task)以及定义构建生命周期。
- Gradlew (Gradle Wrapper):它是 Gradle 的包装器。就是一个脚本(Windows 下是
gradlew.bat,Mac/Linux 下是gradlew)。它的作用是确保每个开发者(以及服务器)都使用完全相同版本的 Gradle,避免“我电脑上能跑,你那里不行”的问题。 - AGP (Android Gradle Plugin):它是 Gradle 的一个插件。Gradle 本身并不知道如何编译
.dex文件或打包 APK,Google 开发了 AGP 注入到 Gradle 中,给它增加了处理 Android 资源、签名、混淆等专属功能。
Q:AGP 和 Android SDK 有什么关系?
A:AGP 使用 Android SDK 中的工具(如aapt2、dx/d8、zipalign)来完成实际构建,但它本身是独立的 Gradle 插件。
Q:如何升级 AGP?
- 修改
build.gradle中的版本号; - 根据 官方迁移指南 调整配置;
- 同步 Gradle 版本(修改
gradle/wrapper/gradle-wrapper.properties)。
Q:AGP 开源吗?
是的!源码在 AOSP:https://cs.android.com/android/platform/superproject/+/master:tools/base/
Q:AAR、APK 以及 JAR 什么关系?
A:这三者是不同阶段生成的压缩包产物(其实都是 ZIP 格式)。
- JAR (Java Archive):最纯粹。 里面只包含编译后
.class字节码和一些配置文件。它不能包含 Android 的资源文件(如布局 Layout、图片 Drawable)。 - AAR (Android Archive):Android 专属库。 它是为了弥补 JAR 的不足而生的。除了包含代码(通常是一个嵌套在内的
classes.jar),还包含了 Android 的资源、清单文件(Manifest)甚至是 C/C++ 库。它是 Module 的产物,供其他 App 调用。 - APK (Android Package):最终成品。它是可以直接安装在手机上的包。它把所有的代码(转成了
.dex格式)、资源、签名信息全部打包在一起。
Q:它们如何协作的?
A:过程如下:
- 通过 Gradlew 调用构建命令
- Gradle 引擎启动,加载 AGP 插件
- AGP 告诉 Gradle 怎么处理你的源代码和资源
- 如果你写的是工具类,可能会被打成 JAR
- 如果你写的是带界面的库,会被打成 AAR
- 如果你写的是一个 App,Gradle 会把所有的代码、JAR 和 AAR 揉在一起,最终吐出一个 APK
Q:什么是.dex?
A:.dex文件是 Android 平台的“可执行文件”,全称是 Dalvik Executable。在传统的 Java 环境中,每个.java文件编译后会生成一个独立的.class文件,会造成几个问题:
- 重复信息多: 每个
.class文件都有自己的常量池,如果一个项目有 1000 个类,很多基础字符串(如java/lang/String)就会在 1000 个文件中重复出现。 - 占用空间大: 重复信息会导致安装包(APK)臃肿,且手机加载时需要频繁读取多个文件,效率低。
而Android SDK 中的工具(如d8或旧版的dx)会将所有的.class文件整合并压缩成一个(或几个).dex文件:
- 去重合并: 它将所有类的常量池合并在一起,相同的字符串和常量只存储一份。
- 寄存器架构: 与 JVM 的“栈架构”不同,Android 的虚拟机(Dalvik 或 ART)采用“寄存器架构”。这种方式生成的指令更少,执行效率更高,更适合移动设备。
- 紧凑布局:
.dex格式专门为共享数据设计,极大地减小了代码占用的空间。
混淆(R8)、签名、Lint 检查
混淆(R8)、签名(Signing)和 Lint 检查是 Android 应用构建和发布流程中的关键环节,分别用于代码保护、身份认证和代码质量保障。
1. 混淆(Obfuscation)—— 由 R8 实现
混淆是指在构建 Release 版本时,将你的源代码中的类名、方法名、变量名等替换为无意义的短名称(如a, b, c),使反编译后的代码难以阅读和理解。
目的:
- 防止他人轻易逆向工程你的 App
- 减小 APK/AAB 体积(移除无用代码 + 名称缩短)
谁来做?—— R8
- Google 官方工具,集成在 AGP 中(从 Android Studio 3.4 开始默认启用)。
- R8 = ProGuard 的继任者,功能更强、速度更快。
- 它同时完成三件事:
- Shrinking(压缩):删除未使用的类、方法、字段;
- Obfuscation(混淆):重命名保留的代码;
- Optimization(优化):简化字节码(如内联方法)。
如何启用?
在模块级build.gradle中:
android {
buildTypes {
release {
minifyEnabled true // 启用 R8
shrinkResources true // 同时移除未使用的资源(可选)
proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro" // 自定义规则文件
}
}
}注意事项
- 第三方库或反射调用的类必须加白名单,否则运行时会崩溃。
- 自定义规则写在
proguard-rules.pro中
例如:
# 保留某个类不被混淆
-keep class com.example.MyKeepClass { *; }
# 保留所有 Activity(因 AndroidManifest 中通过字符串引用)
-keep public class * extends android.app.Activity构建后,可以在app/build/outputs/mapping/release/找到mapping.txt,用于反混淆崩溃日志。
2. 签名(Signing)
数字签名是 Android 系统用来验证 App 身份和完整性的机制。每个安装到设备上的 APK 必须经过签名,否则无法安装。
为什么需要?
- 唯一标识开发者:系统通过签名区分不同开发者(即使包名相同)
- 允许覆盖安装:只有相同签名的 APK 才能升级已安装应用
- 权限共享:同一签名的不同 App 可共享数据(通过
sharedUserId) - Google Play 要求:上传 AAB 必须使用正式签名
两种签名类型
| 类型 | 用途 | 密钥管理 |
|---|---|---|
| 调试签名(debug) | 开发阶段自动使用 | Android SDK 自动生成(~/.android/debug.keystore) |
| 正式签名(release) | 发布到商店或用户 | 你自己生成并严格保管(如 my-release-key.jks) |
如何配置正式签名?
- 生成密钥库(Keystore):
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-alias- 在
build.gradle中引用:
android {
signingConfigs {
release {
storeFile file("my-release-key.jks")
storePassword "your_store_password"
keyAlias "my-key-alias"
keyPassword "your_key_password"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}重要安全提示:
- 不要将密码明文写在
build.gradle中,建议使用gradle.properties或环境变量。- 密钥一旦丢失,无法更新已有应用(Google Play 支持“密钥升级”但流程复杂)。
3. Lint 检查
Lint 是 Android 官方提供的静态代码分析工具。它在不运行代码的情况下,扫描你的项目,找出:
- 潜在 Bug(如空指针、资源泄漏)
- 性能问题(如主线程 I/O)
- 安全漏洞(如硬编码敏感信息)
- 国际化/无障碍问题
- 代码风格与最佳实践违规
谁来执行?
- 集成在 Android Studio 中(实时高亮警告);
- 也可通过命令行运行:
./gradlew lint
如何配置?
在build.gradle中:
android {
lint {
abortOnError false // Lint 错误是否中断构建
checkReleaseBuilds true // 是否在 release 构建时检查
disable 'MissingTranslation', 'HardcodedText' // 禁用某些检查
enable 'UnusedResources' // 强制启用某些检查
htmlOutput file("lint-report.html") // 生成报告
}
}📊 输出结果
- 在 Android Studio 中:红色波浪线 + 问题面板
- 命令行:生成 HTML/XML 报告(默认在
app/build/reports/lint-results.html)
💡 示例问题
| 问题类型 | 示例 |
|---|---|
| Correctness | RecyclerView忘记设置LayoutManager |
| Performance | 在onDraw()中创建对象 |
| Security | 日志中打印用户密码 |
| Usability | Button 没有设置contentDescription(无障碍) |
建议:将 Lint 集成到 CI 流程中,确保主干代码质量。
三者关系总结
| 功能 | 阶段 | 目的 | 工具 |
|---|---|---|---|
| 混淆(R8) | 构建(Build) | 保护代码 + 减小体积 | R8(AGP 内置) |
| 签名(Signing) | 构建/发布 | 身份认证 + 安装验证 | jarsigner / apksigner |
| Lint 检查 | 开发/CI | 提升代码质量 | Android Lint |
它们通常在 Release 构建流程中依次发生:
代码 → Lint 检查 → 编译 → R8 混淆/压缩 → 签名 → 生成 APK/AAB✅ 最佳实践建议
- Release 包必须开启 R8 + 正式签名;
- **Lint 错误应设为**** **
abortOnError true(团队强制规范); - 混淆规则要随第三方库更新及时维护;
- 签名密钥由专人保管,禁止提交到 Git;
- 利用
mapping.txt和lint-report.html做发布归档。
AGP 完整学习路径(从入门到进阶)
✅ 阶段 1:基础认知(1~2 天)
目标:理解 AGP 是什么、在哪配置、基本结构
- 了解 Gradle 与 AGP 的关系
- 区分 项目级 vs 模块级
build.gradle - 学会配置
compileSdk、minSdk、targetSdk - 理解
buildTypes和productFlavors - 掌握依赖写法:
implementation、api、debugImplementation等
📌 实践任务:
// 创建一个带 flavor 的 app 模块
android {
flavorDimensions "version"
productFlavors {
free { dimension "version" }
pro { dimension "version" }
}
}✅ 阶段 2:核心配置与优化(3~5 天)
目标:掌握常用配置项,提升构建效率
- 配置 Java/Kotlin 版本(
compileOptions/kotlinOptions) - 启用 ViewBinding / DataBinding / Jetpack Compose
- 配置 ProGuard / R8 混淆规则
- 理解
sourceSets(自定义资源/代码目录) - 使用
lintOptions控制代码检查 - 了解
buildFeatures开关(如aidl,renderScript)
📌 关键概念:
- Variant(变体) = Build Type + Flavor 的组合(如
freeDebug) - Task DAG:AGP 自动生成大量 task(如
assembleDebug,bundleRelease)
✅ 阶段 3:高级主题(1~2 周)
目标:解决复杂构建问题,定制化流程
- 自定义 Task 并挂载到 AGP 生命周期(如
preBuild.doLast {}) - 使用
androidComponentsAPI(AGP 7.0+ 新扩展点) - 多模块项目依赖管理(避免循环依赖)
- 构建缓存(Build Cache)、增量编译原理
- 性能分析:使用
—profile、gradle-profiler - 迁移到 Version Catalog(
libs.versions.toml) 统一依赖版本
📌 示例:在打包前动态修改 versionName
androidComponents.onVariants { variant ->
variant.outputs.forEach { output ->
output.versionName.set("2.0-custom")
}
}✅ 阶段 4:源码与原理(可选,进阶)
目标:深入理解 AGP 内部机制
- 阅读 AGP 官方设计文档
- 调试 AGP 源码(通过 AOSP 或 decompiled jar)
- 理解 Transform API(已废弃) vs 新的 Artifact API
- 编写自定义 Gradle 插件集成 AGP
📚 三、权威官方文档(按优先级排序)
| 资源 | 说明 | 链接 |
|---|---|---|
| 1. AGP 官方指南(必读) | 全面介绍配置选项、最佳实践 | https://developer.android.com/build |
| 2. AGP 版本发布说明 | 每个版本的新特性、Breaking Changes | https://developer.android.com/build/releases/gradle-plugin |
| 3. AGP 与 Gradle 兼容表 | 避免版本不匹配导致 Sync 失败 | https://developer.android.com/build/releases/gradle-plugin#compatibility |
| 4. Android 构建教程(Codelab) | 动手实验:多模块、Flavor、性能优化 | https://developer.android.com/codelabs/android-build-speed |
| 5. Gradle 官方文档 | 理解底层构建系统 | https://docs.gradle.org/current/userguide/userguide.html |
| 6. Android 构建源码(AOSP) | 查看 AGP 实现细节 | https://cs.android.com/android/platform/superproject/+/master:tools/base/ |
🔧 四、实用工具 & 调试技巧
| 工具 | 用途 |
|---|---|
./gradlew tasks —all | 查看所有可用 task |
./gradlew assembleDebug —info | 查看详细构建日志 |
./gradlew buildEnvironment | 检查插件和依赖版本 |
| Gradle Enterprise / Build Scan | 可视化构建性能(团队级) |
| Android Studio → Build Analyzer | 分析构建瓶颈(AS 4.2+) |
💡 五、常见误区提醒
- ❌ 不要直接在
build.gradle顶层写文件 I/O 操作(会在 Sync 时执行!) - ❌ 避免使用已废弃的
compile、apk依赖配置 - ❌ 不要随意升级 AGP 而不看迁移指南(常有 Breaking Changes)
- ✅ 推荐使用 KTS(Kotlin DSL) 替代 Groovy(类型安全、自动补全更好)
🎁 附加:推荐学习顺序清单
- 通读 Android 构建概述
- 动手创建一个多 Flavor 项目
- 尝试启用 R8 混淆并验证 APK
- 使用
libs.versions.toml管理依赖 - 阅读最新 AGP 版本的 Release Notes
- 用
—profile分析一次完整构建耗时
更新: 2026-01-09 17:25:37
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/vbhfnvngsimgry7h