Android项目级build.gradle换新格式后如何迁移原有Gradle配置?
Android 项目级Gradle新格式适配步骤
这个新格式是AGP 7.0+版本之后官方推荐的新DSL写法,核心是把插件、仓库配置做统一收敛,适配全程不用改业务依赖,按下面三步改就行:
- 第一步:修改根目录
build.gradle
直接删掉原来的buildscript、allprojects两个代码块,只保留两部分内容:- 顶层
plugins块:把原来buildscript.dependencies里声明的所有Gradle插件,全部按id '插件ID' version '版本号' apply false的格式挪到这里,apply false表示插件不在根项目生效,只做版本声明,供子模块按需引用。
对应你旧配置的转换参考:
- 原
classpath 'com.android.tools.build:gradle:7.2.1'对应拆为com.android.application、com.android.library两个插件,版本都填7.2.1 - 原
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"对应org.jetbrains.kotlin.android插件,版本填你实际使用的Kotlin版本即可 - 原
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"对应id 'androidx.navigation.safeargs.kotlin' version '2.4.2' apply false
之前在buildscript里用ext定义的全局版本变量,可以直接在plugins块外保留,所有子模块照样能正常引用,不需要强制改其他写法。
- 保留原有的
clean任务即可,不需要调整逻辑。
改完的根build.gradle就和你给出的新格式示例结构完全一致。
- 顶层
- 第二步:修改根目录
settings.gradle
原来写在buildscript.repositories、allprojects.repositories里的所有仓库地址,全部挪到这个文件里做统一管理,参考配置如下:
上面配置里的// 插件解析用的仓库,对应原buildscript.repositories pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() // 私有仓库地址也加到这里 // 注意jcenter已停服,非必要不要添加,确实有遗留依赖无法迁移再加jcenter() } } // 普通项目依赖解析用的仓库,对应原allprojects.repositories dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() // 私有仓库、jcenter等非必要源同样放这里 } } rootProject.name = "你的项目名称" include ':app' // 原文件里其他include子模块的语句全部保留,不需要修改FAIL_ON_PROJECT_REPOS作用是强制所有子模块使用这里统一配置的仓库,禁止子模块单独声明仓库,能避免多模块下仓库源混乱导致的依赖冲突,老项目如果暂时适配不了可以删掉这行,Gradle会兼容子模块自己配仓库的写法。 - 第三步:微调子模块的
build.gradle
子模块里原来的apply plugin写法可以直接替换为plugins块,引用根目录已经声明过版本的插件时不需要再写版本号,比如app模块的插件声明可以改成:
模块内原有的plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'androidx.navigation.safeargs.kotlin' // 其他用到的插件直接写ID即可 }android配置块、dependencies依赖块完全不需要改动,之前写的依赖引用、编译配置都能正常运行。
常见适配注意点
- 不需要追求一步到位把所有配置都改成新写法,Gradle完全支持新旧DSL混写,如果遇到个别老的第三方插件找不到对应插件ID,可以暂时在根build.gradle里保留
buildscript块加classpath依赖,不影响整体运行。 - 适配过程中优先把仓库源从jcenter迁到mavenCentral或者google,jcenter已经停止维护,后续很可能出现依赖拉取失败的问题。
- 如果项目用了Kotlin kapt注解处理器,记得在根目录的plugins块里加上
id 'org.jetbrains.kotlin.kapt' version '你的Kotlin版本' apply false,子模块直接引用即可。
内容的提问来源于stack exchange,提问作者padlanau
相关产品推荐
相关产品推荐

