Skip to content

AGP 迁移指南

源:Android 官方文档 - AGP 版本说明

Android Gradle Plugin (AGP) 随着版本更新会引入新功能和破坏性变更。本文档详细说明每个大版本的迁移步骤。

版本兼容性

AGP 与 Gradle 版本对应

AGP 版本最低 Gradle推荐 Gradle最低 JDK最高 API Level
9.09.19.41736
8.78.98.11.11735
8.08.08.21734
7.47.57.61133
7.07.07.21131

迁移到 AGP 9.0 2026年1月

AGP 9.0 是重大更新,引入了内置 Kotlin 支持和新 DSL 接口。

关键破坏性变更

内置 Kotlin 支持 重大变更

AGP 9.0 内置 Kotlin 支持,默认启用。无需再手动应用 Kotlin 插件。

迁移前(AGP 8.x)

kotlin
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android") version "2.1.0"  // 需要显式声明
}

迁移后(AGP 9.0)

kotlin
plugins {
    id("com.android.application")  // Kotlin 支持已内置
   // 移除 kotlin-android 插件
}

⚠️ 临时退出(不推荐):

properties
# gradle.properties
android.builtInKotlin=false  # 将在 AGP 10.0 移除

新 DSL 接口仅实现公共接口

AGP 9.0 仅实现新的公共 DSL 接口,旧的内部 DSL 类型不再被识别。

废弃的 API

kotlin
// ❌ 废弃:applicationVariants API
android.applicationVariants.all { variant ->
    // 旧的 variant API
}

新的 API

kotlin
// ✅ 使用:androidComponents API
androidComponents {
    onVariants { variant ->
        // 新的 variant API
    }
}

Kotlin运行时依赖

AGP 9.0 对 Kotlin Gradle Plugin (KGP) 有运行时依赖。

升级 KGP

kotlin
// settings.gradle.kts
pluginManagement {
    plugins {
        kotlin("android") version "2.1.10"  // 使用更高版本的KGP
    }
}

降级 KGP(不推荐):

properties
# gradle.properties
android.experimental.kgpVersion=2.0.0  # 降级到特定版本

详细迁移步骤

更新 Gradle 和 AGP

bash
# 更新 Gradle Wrapper
./gradlew wrapper --gradle-version 9.4
kotlin
// build.gradle.kts (project)
plugins {
    id("com.android.application") version "9.0.0" apply false
    id("com.android.library") version "9.0.0" apply false
}

移除 Kotlin Android 插件

从所有模块的 build.gradle.kts 中移除:

kotlin
// ❌ 移除
id("org.jetbrains.kotlin.android")

更新自定义构建逻辑

替换所有使用旧 Variant API 的代码。

迁移前

kotlin
android.applicationVariants.all { variant ->
    val variantName = variant.name
    variant.outputs.forEach { output ->
        // 自定义输出
    }
}

迁移后

kotlin
androidComponents {
    onVariants { variant ->
        val variantName = variant.name
        variant.artifacts.use(/* ... */)
    }
}

更新第三方插件

确保所有插件兼容 AGP 9.0:

  • Hilt Gradle Plugin 2.50+
  • KSP 2.1.0-1.0.29+
  • Firebase Crashlytics Gradle Plugin 3.0.2+

处理已移除的 API

查看 AGP 9.0 发布说明 检查使用的 API 是否被移除。

临时兼容性标志(仅用于测试):

properties
# gradle.properties
android.builtInKotlin=false  # 禁用内置 Kotlin(临时)
android.newDsl=false  # 使用旧DSL(临时)

⚠️ 警告:这些标志将在 AGP 10.0 中移除!

Kotlin Multiplatform 项目迁移

如果您使用 Kotlin Multiplatform,迁移更复杂。

使用新的 Android KMP 库插件

kotlin
// 旧方式(不兼容AGP 9.0)
plugins {
    kotlin("multiplatform")
    id("com.android.library")
}

// 新方式
plugins {
    kotlin("multiplatform")
    id("com.android.kotlin.multiplatform.library")  // 新插件
}

详细迁移步骤请参考 Kotlin 官方文档

已移除的功能

  • android.dataBinding.addDefaultAdapters
  • android.dataBinding.addKtx
  • BuildConfig 默认值改为 false
  • Variant API 旧接口

迁移到 AGP 8.0 2023年4月

AGP 8.0 是一个重大版本,强制要求 Namespace、JDK 17,并改变了多个默认值。

关键破坏性变更

Namespace 必需 破坏性变更

AGP 8.0 要求在 build.gradle.kts 中定义 namespace,不能仅在 AndroidManifest.xml 中定义。

迁移前(AGP 7.x)

xml
<!-- AndroidManifest.xml -->
<manifest package="com.example.myapp">

迁移后(AGP 8.0+)

kotlin
android {
    namespace = "com.example.myapp"  // 必须设置
    compileSdk = 34
}
xml
<manifest>
    <!-- package 属性可选 -->
</manifest>

JDK 17 必需

AGP 8.0 要求 JDK 17 运行。

配置方式

properties
# gradle.properties
org.gradle.java.home=/path/to/jdk-17

或在 Android Studio: PreferencesBuild, Execution, DeploymentBuild ToolsGradleGradle JDK → 选择 JDK 17

BuildConfig 默认禁用

AGP 8.0 起,BuildConfig 类默认不生成。

错误示例

Unresolved reference: BuildConfig

解决方法

kotlin
android {
    buildFeatures {
        buildConfig = true  // 启用 BuildConfig
    }
}

默认值变更

以下属性默认值已改变,可能影响您的构建:

properties
# gradle.properties

# BuildConfig 默认禁用
android.defaults.buildfeatures.buildconfig=false  # 旧:true

# AIDL 默认禁用
android.defaults.buildfeatures.aidl=false  # 旧:true

# RenderScript 默认禁用
android.defaults.buildfeatures.renderscript=false  # 旧:true

# 非常量 R 类启用
android.nonFinalResIds=true  # 旧:false

# 非传递性 R 类启用
android.nonTransitiveRClass=true  # 旧:false

# R8 Full Mode 启用
android.enableR8.fullMode=true  # 旧:false

迁移建议

  1. 检查是否使用了上述功能
  2. 如需要,在 gradle.properties 中显式设置回旧值
  3. 或更新代码适配新默认值

强制执行的属性

以下属性值被强制执行,无法更改:

properties
# gradle.properties(设置这些值会被忽略并警告)

android.r8.failOnMissingClasses=true  # 强制为 true
android.enableArtProfiles=true  # 强制为 true
android.enableNewResourceShrinker=true  # 强制为 true

详细迁移步骤

更新 Gradle Wrapper

bash
./gradlew wrapper --gradle-version 8.2

更新 AGP 版本

kotlin
plugins {
    id("com.android.application") version "8.7.3"
    id("org.jetbrains.kotlin.android") version "2.1.0"
}
groovy
buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:8.7.3'
    }
}

更新 JDK 到 17

验证 JDK 版本:

bash
java -version

为所有模块添加 namespace

kotlin
// app/build.gradle.kts
android {
    namespace = "com.example.myapp"
}

// mylibrary/build.gradle.kts
android {
    namespace = "com.example.mylibrary"
}

处理测试 namespace 冲突

如果测试 namespace 与主 namespace 相同,需要手动修改:

kotlin
android {
    namespace = "com.example.myapp"
    testNamespace = "com.example.myapp.test"  // 修改测试 namespace
}

启用 BuildConfig(如需要)

kotlin
android {
    buildFeatures {
        buildConfig = true
    }
}

更新 R8 ProGuard 规则

由于 android.r8.failOnMissingClasses=true,所有缺失类警告现在会导致构建失败。

添加必要的 -dontwarn 规则:

proguard
# proguard-rules.pro
-dontwarn java.lang.instrument.ClassFileTransformer

或查看生成的 missing_rules.txt

app/build/outputs/mapping/release/missing_rules.txt

使用 AGP Upgrade Assistant

Android Studio 提供升级助手:

ToolsAGP Upgrade Assistant

自动检测和修复:

  • Namespace 缺失
  • BuildConfig 引用
  • 版本兼容性问题
  • 废弃 API 使用

迁移到 AGP 7.0 2021年7月

AGP 7.0 引入 JDK 11 要求和新的 Variant API。

关键变更

JDK 11 必需

AGP 7.0 要求 JDK 11 运行 Gradle。

配置方式

properties
# gradle.properties
org.gradle.java.home=/path/to/jdk-11

或设置环境变量:

bash
export JAVA_HOME=/path/to/jdk-11

Variant API 稳定

新的 Variant API 现已稳定,推荐使用。

旧 API(废弃)

groovy
android.applicationVariants.all { variant ->
    // 旧方式
}

新 API

kotlin
androidComponents {
    onVariants { variant ->
        // 新方式
    }
}

支持 Java 11 源代码

可以在项目中使用 Java 11 特性。

kotlin
android {
    compileSdk = 30
    
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    
    kotlinOptions {
        jvmTarget = "11"
    }
}

R8 缺失类警告

AGP 7.0 开始,R8 会更严格地警告缺失的类。

警告示例

R8: Missing class: java.lang.instrument.ClassFileTransformer

处理方式

添加到 proguard-rules.pro

proguard
-dontwarn java.lang.instrument.ClassFileTransformer

或启用失败模式(推荐用于生产):

properties
# gradle.properties
android.r8.failOnMissingClasses=true

详细迁移步骤

更新 Gradle Wrapper

bash
./gradlew wrapper --gradle-version 7.2

更新 AGP 版本

kotlin
plugins {
    id("com.android.application") version "7.4.2"
    kotlin("android") version "1.9.0"
}

更新 JDK 到 11

验证版本:

bash
java -version  # 应显示 11.x

更新 Kotlin 到 1.5+

AGP 7.0 要求 Kotlin 1.5.0 或更高版本。

kotlin
plugins {
    kotlin("android") version "1.9.0"
}

启用非传递性 R 类(可选但推荐):

properties
# gradle.properties
android.nonTransitiveRClass=true

处理 Android Gradle Plugin 构建缓存移除

以下属性已移除,如果还在使用需删除:

properties
# ❌ 已移除
android.enableBuildCache
android.buildCacheDir

构建缓存现在完全由 Gradle build cache 处理。

依赖配置移除

某些已废弃的依赖配置被移除:

被移除

  • compile → 使用 implementation
  • testCompile → 使用 testImplementation
  • androidTestCompile → 使用 androidTestImplementation

通用迁移最佳实践

逐步升级

  • 不要跨多个大版本升级
  • 例如:7.4 → 8.0 → 8.7 → 9.0

在独立分支测试

  • 创建新分支进行升级
  • 完整测试后再合并
  • 保留回滚选项

阅读发布说明

  • 查看每个版本的 Release Notes
  • 关注破坏性变更章节
  • 检查废弃 API 列表

更新所有依赖

  • 确保所有库兼容新 AGP 版本
  • 更新第三方 Gradle 插件
  • 检查插件最低 AGP 要求

使用自动化工具

  • Android Studio AGP Upgrade Assistant
  • Lint 检查废弃 API
  • 查看构建警告

分阶段迁移

  1. 第一阶段:修复破坏性变更
  2. 第二阶段:处理废弃 API
  3. 第三阶段:启用新功能

保留兼容性标志(临时)

properties
# gradle.properties
# 仅用于测试,不要长期依赖
android.builtInKotlin=false  # AGP 9.0+
# 这些标志会在后续版本移除

监控构建性能

  • 使用 Build Analyzer 分析构建时间
  • 检查新版本是否影响性能
  • 调整构建配置优化

完整测试

  • 运行所有单元测试
  • 运行所有 instrumentation 测试
  • 手动测试关键功能
  • 在所有目标设备上测试