android studio项目gradle从3.0.0升级到7.4.2的详细步骤
最近因项目需要必须要将gradle升级到7.4.2,升级过程一波三折,问题太多,因此将详细过程记录下来,为以后升级做参考。
我的android studio目前的版本是Arctic Fox | 2020.3.1
当前的项目级gradle文件内容:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
//jcenter() //构建脚本中所依赖的库都在jcenter仓库下载
google()
mavenCentral() // 必须添加
}
dependencies {
//指定了gradle插件的版本
classpath 'com.android.tools.build:gradle:3.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
mavenCentral() // 必须添加
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
模块级gradle文件内容:
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
buildToolsVersion '26.0.2'
defaultConfig {
applicationId "com.hongyisoft.arithmetictraining"
minSdkVersion 21
targetSdkVersion 30
versionCode 2
versionName "1.0.1"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
compileOnly files('libs/magic-android-34.38.1.200.jar')
testImplementation 'junit:junit:4.12'
implementation 'com.android.support:design:26.0.0-alpha1'
implementation "com.android.support:support-annotations:28.0.0"
implementation 'com.google.zxing:core:3.3.0'
}
以下是逐步升级 Gradle 和适配 Android Studio Arctic Fox 的详细指南:
一、环境准备
- 升级 Android Studio:Arctic Fox (2020.3.1) 对 Gradle 7.x 支持有限,建议至少升级到 Android Studio Flamingo (2022.2.1) 或更高版本。
- 进入程序和功能卸载旧版本(卸载时不知为何uninstall.exe文件丢失,在设置的应用和功能卸载会提示找不到uninstall.exe文件,但在程序和功能页面可以卸载,貌似就删除了系统注册表的信息,软件依然存在,然后进入安装目录将Android Studio文件夹删除)。

3. 下载新版本,直接点击安装,按照提示一直下一步即可(安装很顺利)
升级软件包:android-studio-2022.3.1.20-windows.exe
链接: https://pan.baidu.com/s/1xWPurLgaor-IRMV3k_yBLg?pwd=bdbd 提取码: bdbd
二、项目级 build.gradle 修改
buildscript {
repositories {
google()
mavenCentral() // 删除 jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.4.2' // 升级插件版本
}
}
allprojects {
repositories {
google()
mavenCentral() // 删除 jcenter()
}
}
三、模块级 build.gradle 修改
plugins {
id 'com.android.application' // 替换 apply plugin 方式
}
android {
compileSdkVersion 33 // 升级到最新
// buildToolsVersion 已废弃,删除此行
defaultConfig {
// ... 其他配置不变
targetSdkVersion 33 // 建议升级
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 更新文件名
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11 // Gradle 7.x 需要 JDK 11
targetCompatibility JavaVersion.VERSION_11
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 迁移到 AndroidX
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0' // 替换 design 库
implementation 'androidx.annotation:annotation:1.7.0' // 替换 support-annotations
// 更新其他依赖
implementation 'com.google.zxing:core:3.5.2' // 升级 ZXing
testImplementation 'junit:junit:4.13.2'
compileOnly files('libs/magic-android-34.38.1.200.jar') // 检查该库是否兼容
}
四、全局配置
-
修改
gradle-wrapper.propertiesdistributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip -
添加
gradle.propertiesandroid.useAndroidX=true android.enableJetifier=true # 自动转换旧依赖到 AndroidX
JDK 配置(实际未做修改)
- 在 Android Studio 中设置 JDK 17:
File → Project Structure → SDK Location → JDK 17.

配置项目的 Gradle JDK
- 步骤:
- 打开项目后,进入设置界面:
File → Settings → Build, Execution, Deployment → Build Tools → Gradle(Windows/Linux)
或
- 在 Gradle JDK 下拉菜单中,选择
corretto-17或已安装的 JDK 17 路径:
- 打开项目后,进入设置界面:

3. 验证 JDK 版本
- 方法 1:在 Android Studio 的终端中运行以下命令:
./gradlew -version

- 检查输出中的
JVM版本是否为 17+(与预期好像不一致,后面项目可以正常运行先不管了):JVM: 17.0.7 (Eclipse Adoptium 17.0.7+8)
4. 修改模块的 Java 兼容性
- 在模块级
build.gradle中,确保compileOptions使用 Java 11:
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
}
升级完毕,开始编译
升级后android.support.v7.app.AppCompatActivity报错了
问题原因
- AGP 8.0+ 默认强制使用 AndroidX,不再支持
android.support包。 - 你的代码或依赖项中仍有对
android.support.v7.app.AppCompatActivity的引用。
强制启用 AndroidX 并迁移代码
- 在
gradle.properties中添加以下配置(如果已存在则跳过):android.useAndroidX=true android.enableJetifier=true - Jetifier 会自动将第三方库中的 Support 库转换为 AndroidX(但对本地代码无效)。
2. 迁移代码中的 Support 类到 AndroidX
- 手动替换代码中所有
android.support.v7.app.AppCompatActivity为androidx.appcompat.app.AppCompatActivity。
更新模块级依赖项
- 替换所有
com.android.support依赖为对应的 AndroidX 库:
dependencies {
// 删除旧的 Support 库依赖
// implementation 'com.android.support:design:26.0.0-alpha1'
// 使用 AndroidX 替代库
implementation 'androidx.appcompat:appcompat:1.6.1' // 替代 v7
implementation 'com.google.android.material:material:1.9.0' // 替代 design
implementation 'androidx.annotation:annotation:1.7.0' // 替代 support-annotations
}
import android.support.annotation.NonNull报错
问题原因
错误 import android.support.annotation.NonNull 表明你的代码中仍在使用 Support 库的注解类,而升级到 AGP 8.0+ 后已强制使用 AndroidX。以下是完整的修复步骤:
解决方案
1. 手动替换 Support 注解为 AndroidX
- 将所有代码中的
android.support.annotation.NonNull替换为androidx.annotation.NonNull。 - 其他常见注解的替换:
// 修改前
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
// 修改后
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
2. 更新模块级依赖项
- 确保
build.gradle中删除了所有com.android.support依赖,替换为 AndroidX:
dependencies {
// 删除旧的 Support 依赖
// implementation 'com.android.support:design:26.0.0-alpha1'
// implementation 'com.android.support:support-annotations:28.0.0'
// 使用 AndroidX 注解库
implementation 'androidx.annotation:annotation:1.7.0'
}
XML 布局文件中残留 Support 类
- 检查布局文件(如
activity_main.xml),确保没有类似android.support.v7.widget.Toolbar的引用。 - 替换为 AndroidX 类:
<!-- 修改前 -->
<android.support.v7.widget.Toolbar ... />
<!-- 修改后 -->
<androidx.appcompat.widget.Toolbar ... />
import android.support.v4.app.ActivityCompat; import android.support.v4.app.NavUtils; import android.support.v4.content.ContextCompat报错
问题原因
升级到 AndroidX 后,代码中残留的 android.support.v4 包下的类未替换为对应的 AndroidX 类,导致编译错误。这是因为 Support 库的 v4 包已被拆分到不同的 AndroidX 模块中(如 androidx.core、androidx.fragment 等)。以下是修复步骤:
解决方案
1. 手动替换 android.support.v4 类为 AndroidX
- 将代码中所有
android.support.v4的引用替换为对应的 AndroidX 类:
// 修改前
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.NavUtils;
import android.support.v4.content.ContextCompat;
// 修改后
import androidx.core.app.ActivityCompat;
import androidx.core.app.NavUtils;
import androidx.core.content.ContextCompat;
2. 更新 build.gradle 依赖
- 确保模块级
build.gradle中删除了所有com.android.support:support-v4依赖,替换为 AndroidX 的core和fragment库:
dependencies {
// 删除旧的 Support v4 依赖
// implementation 'com.android.support:support-v4:28.0.0'
// 使用 AndroidX 替代库
implementation 'androidx.core:core:1.12.0' // 包含 ContextCompat、ActivityCompat
implementation 'androidx.fragment:fragment:1.6.2' // 包含 Fragment 相关类
}
5. 检查 XML 布局文件
- 某些 XML 布局可能直接引用了 Support 库的类(如自定义 View),需替换为 AndroidX:
<!-- 修改前 -->
<view class="android.support.v4.widget.SwipeRefreshLayout" ... />
<!-- 修改后 -->
<view class="androidx.swiperefreshlayout.widget.SwipeRefreshLayout" ... />
import android.support.design.widget.TabLayout; import android.support.v4.view.ViewPager;报错
问题原因
- Support 库的
design组件(如TabLayout)迁移到 AndroidX 后属于 Material Design 组件库。 - Support 库的
viewpager 迁移到 AndroidX 后属于androidx.viewpager模块。 - 代码中仍然依赖旧版 Support 库的类,导致编译失败。
解决方案
1. 手动替换代码中的引用
- 将代码中的旧包名替换为 AndroidX 包名:
// 修改前
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
// 修改后
import com.google.android.material.tabs.TabLayout; // Material Design 组件
import androidx.viewpager.widget.ViewPager; // AndroidX ViewPager
2. 更新 build.gradle 依赖
- 删除所有旧版 Support 库依赖,替换为 AndroidX 替代库:
dependencies {
// 删除旧版 Support 依赖
// implementation 'com.android.support:design:28.0.0'
// implementation 'com.android.support:support-v4:28.0.0'
// 使用 AndroidX 替代库
implementation 'com.google.android.material:material:1.9.0' // 包含 TabLayout
implementation 'androidx.viewpager:viewpager:1.0.0' // ViewPager(需手动添加)
}
3. 检查 XML 布局文件
- 确保 XML 布局文件中的控件路径也更新为 AndroidX:
<!-- 修改前 -->
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- 修改后 -->
<com.google.android.material.tabs.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.viewpager.widget.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent" />
import android.support.annotation.ColorInt;import android.support.v7.app.AlertDialog;import android.support.annotation.RequiresApi;报错
问题原因
升级到 AndroidX 后,代码中残留的 android.support.v7 和 android.support.annotation 包下的类未替换为对应的 AndroidX 类。这是因为:
v7组件(如AlertDialog)迁移到 AndroidX 的appcompat模块。annotation类(如ColorInt、RequiresApi)迁移到 AndroidX 的annotation模块。
解决方案
1. 手动替换代码中的引用
- 将代码中的旧包名替换为 AndroidX 包名:
// 修改前
import android.support.v7.app.AlertDialog;
import android.support.annotation.ColorInt;
import android.support.annotation.RequiresApi;
// 修改后
import androidx.appcompat.app.AlertDialog; // v7 AlertDialog
import androidx.annotation.ColorInt; // 注解类
import androidx.annotation.RequiresApi; // 注解类
2. 更新 build.gradle 依赖
- 确保模块级
build.gradle中包含以下 AndroidX 依赖:
dependencies {
// 删除旧版 Support 依赖
// implementation 'com.android.support:appcompat-v7:28.0.0'
// implementation 'com.android.support:support-annotations:28.0.0'
// 添加 AndroidX 替代库
implementation 'androidx.appcompat:appcompat:1.6.1' // 包含 AlertDialog
implementation 'androidx.annotation:annotation:1.7.0' // 包含 @ColorInt、@RequiresApi
}
3. 检查 XML 布局文件
- 若 XML 文件中直接引用了
android.support.v7组件(如自定义 View),替换为 AndroidX:
<!-- 修改前 -->
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" />
<!-- 修改后 -->
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" />
重新编译又报错了:Dependency 'androidx.core:core-ktx:1.12.0' requires libraries and applications that depend on it to compile against version 34 or later of the Android APIs.
问题分析
错误提示指出 androidx.core:core-ktx:1.12.0 要求项目的 编译版本(Compile SDK) 必须为 API 34(Android 14)或更高。这是因为该库的新版本可能使用了 Android 14 新增的 API 或特性。
网上查询后推荐两个解决方案(个人选择的方案2)
1. 升级项目的 compileSdkVersion 和 targetSdkVersion
- 修改模块级
build.gradle,将编译版本和目标版本设置为 34:android { compileSdk 34 // 关键点:升级到 34 defaultConfig { minSdk 21 targetSdk 34 // 升级到 34 } }
同步更新 Android Gradle 插件版本
- 确保项目级
build.gradle中使用的 Gradle 插件版本支持 API 34:// 项目级 build.gradle dependencies { classpath 'com.android.tools.build:gradle:8.2.0' // 最新稳定版 }
2. 如果无法升级到 API 34,降级 core-ktx 版本
- 选择一个兼容低版本 API 的
core-ktx,例如:dependencies { implementation 'androidx.core:core-ktx:1.9.0' // 支持最低 API 21 } - 查看 core-ktx 版本兼容性 选择合适版本。
import android.test.ApplicationTestCase;报错
问题分析
android.test.ApplicationTestCase 是 旧版 Android 测试框架 中的类,已在 API 24(Android 7.0) 中被弃用,并在后续版本中彻底移除。当你升级到较新的 Android SDK 后,这些旧测试类会因缺失而报错。
解决方案
1. 迁移到 AndroidX 测试框架
旧的 android.test 包已被 AndroidX Test 替代。按以下步骤迁移:
步骤 1:更新 build.gradle 依赖
在模块级 build.gradle 中添加 AndroidX Test 库:
dependencies {
// 添加以下依赖
testImplementation 'junit:junit:4.13.2' // JUnit 4
androidTestImplementation 'androidx.test:core:1.5.0' // AndroidX Test 核心库
androidTestImplementation 'androidx.test:runner:1.5.2' // 测试运行器
androidTestImplementation 'androidx.test:rules:1.5.0' // 测试规则
androidTestImplementation 'androidx.test.ext:junit:1.1.5' // JUnit 扩展
}
步骤 2:修改测试类代码
替换旧的 ApplicationTestCase 为新的测试框架:
// 修改前(旧版)
import android.test.ApplicationTestCase;
public class ApplicationTest extends ApplicationTestCase<MyApplication> {
public ApplicationTest() {
super(MyApplication.class);
}
public void testAppLaunch() {
createApplication(); // 旧方法初始化应用
assertNotNull(getApplication());
}
}
// 修改后(AndroidX)
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertNotNull;
@RunWith(AndroidJUnit4.class) // 使用 AndroidJUnit4 运行器
public class ApplicationTest {
@Test
public void testAppLaunch() {
// 直接获取 Application 实例
MyApplication app = (MyApplication) ApplicationProvider.getApplicationContext();
assertNotNull(app);
}
}
import android.support.v7.widget.RecyclerView;报错
问题分析
android.support.v7.widget.RecyclerView 属于 旧版 Support 库,已被 Google 废弃并迁移到 AndroidX(新架构的扩展库)。当项目升级到新版 Android Gradle 插件或 SDK 时,旧 Support 库的类会因缺失而报错。
解决方案
1. 替换导入路径
将代码中所有 android.support.v7.widget.RecyclerView 替换为 AndroidX 路径:
// 修改前
import android.support.v7.widget.RecyclerView;
// 修改后
import androidx.recyclerview.widget.RecyclerView;
2. 更新 build.gradle 依赖
确保模块级的 build.gradle 中使用 AndroidX 版本的 RecyclerView:
dependencies {
// 替换旧版依赖
implementation 'androidx.recyclerview:recyclerview:1.3.2' // 当前最新稳定版
// 删除旧版依赖(如果存在)
// implementation 'com.android.support:recyclerview-v7:XXX'
}
3. 手动检查 XML 布局文件
布局文件中可能仍残留旧库的全类名路径,例如:
<!-- 修改前 -->
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- 修改后 -->
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent" />
因我的项目引入了OpenCV,因此升级后报错:FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring project ':sdk'. > Could not create an instance of type com.android.build.api.variant.impl.LibraryVariantBuilderImpl.。
问题根源
此错误通常由以下原因导致:
- Android Gradle 插件版本与 Gradle 版本不兼容。
- 旧版 OpenCV SDK 的构建脚本未适配新版 AGP(如 AGP 8.x+)。
- 构建配置中使用了已弃用的语法或重复的 ABI 过滤设置。
解决方案
修复 OpenCV 模块的构建脚本
更新 :sdk 模块的 build.gradle,适配新版 AGP:
-
添加命名空间 (
namespace 'org.opencv')
新版 AGP 强制要求库模块声明命名空间,否则无法实例化变体构建器(即LibraryVariantBuilderImpl错误)。 -
更新属性命名
compileSdkVersion 34➔compileSdk 34targetSdkVersion 34➔targetSdk 34
-
统一 ABI 过滤配置
移除externalNativeBuild.cmake中的重复abiFilters,仅在ndk块中设置一次,避免冲突。 -
兼容 Java 11
确保compileOptions使用 Java 11(新版 AGP 默认要求 Java 17,但需根据项目实际调整)。
apply plugin: 'com.android.library'
def openCVersionName = "4.8.0"
def openCVersionCode = ((4 * 100 + 8) * 100 + 0) * 10 + 0
android {
namespace 'org.opencv' // 添加命名空间(关键修复!)
compileSdk 34 // 使用新版属性名代替 compileSdkVersion
defaultConfig {
minSdk 26
targetSdk 34 // 使用新版属性名代替 targetSdkVersion
versionCode openCVersionCode
versionName openCVersionName
// 统一配置 ABI 过滤器(修复重复设置)
ndk {
abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64'
}
externalNativeBuild {
cmake {
cppFlags "-std=c++11 -fexceptions -frtti"
arguments "-DANDROID_STL=c++_shared"
// 移除此处的 abiFilters,已在 ndk 块统一配置
}
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
buildTypes {
debug {
packagingOptions {
doNotStrip '**/*.so'
}
}
release {
packagingOptions {
doNotStrip '**/*.so'
}
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['native/libs']
java.srcDirs = ['java/src']
aidl.srcDirs = ['java/src']
res.srcDirs = ['java/res']
}
}
}
重新编译的报错:Execution failed for task ':arithmetictraining:checkDebugDuplicateClasses'. > A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable > Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules jetified-kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
问题根源
此错误是由于项目中同时引入了多个版本的 Kotlin 标准库扩展模块(如 kotlin-stdlib-jdk7 和 kotlin-stdlib-jdk8),与新版本的 kotlin-stdlib 主库发生类冲突。关键在于:
- Kotlin 版本升级后的兼容性问题:
从 Kotlin 1.5 开始,kotlin-stdlib-jdk7和kotlin-stdlib-jdk8的功能已合并到kotlin-stdlib中,直接依赖这些扩展库会导致重复类。 - 依赖版本不统一:
项目中可能存在直接或间接引入旧版本扩展库的依赖(如1.6.21),与新版本1.8.20的主库冲突。
解决方案
1. 统一 Kotlin 版本
在项目根目录的 build.gradle 中,强制所有模块使用一致的 Kotlin 版本:
// 项目级 build.gradle
buildscript {
ext.kotlin_version = '1.8.20' // 使用最新稳定版(与 AGP 8.2 兼容)
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
configurations.all {
resolutionStrategy {
// 强制统一所有 Kotlin 相关依赖的版本
force "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
force "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}
}
}
移除冗余的扩展库依赖
检查模块级 build.gradle,删除手动添加的旧版本扩展库:
dependencies {
// 错误示例(直接引入旧版)
// implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21'
// implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21'
// 正确做法:仅依赖 kotlin-stdlib(自动包含 JDK 扩展)
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
编译成功但应用启动时闪退,android studio输出logcat如下: E FATAL EXCEPTION: main Process: com.hongyisoft.arithmetictraining, PID: 2242 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=-1, data=null} to activity {com.hongyisoft.arithmetictraining/com.hongyisoft.arithmetictraining.DeclaredActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference at android.app.ActivityThread.deliverResults(ActivityThread.java:6541)...
根据 Logcat 日志,应用在启动时闪退的原因是 NullPointerException,具体位置在 DeclaredActivity.java 的 onActivityResult 方法的第 253 行。
根本原因:
AndroidManifest.xml文件:
android:name="android.support.v4.content.FileProvider"
替换为:
android:name="androidx.core.content.FileProvider"
更多推荐



所有评论(0)