背景
作为一个好几年没接触过 Android 项目的前开发人员,最近收到重新维护老项目的通知。但是离开 Android 一线开发好几年,现在的 Android 版本、AGP、Android Studio 变得是那么的陌生,而且项目在新的Android Studio Narwhal 4 Feature Drop上已经无法运行。

而且现在也没有完整开发时间来进行升级,于是在一边正常工作的同时,借助 AI 编程来实现老项目的一次升级,中途坎坷但平稳落地
项目结构
先说一下项目结构,项目是 19 年构建的组件化项目,大大小小有十几个不同的组件,而且中间因为公司方向变更,其间没有进行过太大的升级,从最早的 AGP3.2 变成了 AGP3.4,这大概就是其间最大的变化。
现在重新接手后,用新的 Studio 直接无法构建。而且无法直接对线上项目升级,只能找一个老的分支在本地尝试升级
升级伊始
开发工具
这里用的开发工具为这个版本的 Studio + 通义灵码插件

另一个独立的编辑器就是 TRAE CN。两个编辑器同时打开。这里吐槽一下,16G 内存现在开发真的不够用,当然之前的时候 TRAE CN 的版本还没有这么新

这两个工具分工主要是:Android Studio 负责运行和修改轻微问题,TRAE CN 负责自动处理和修改:
- TRAE CN 目前无法直接运行 Android 项目,我没找到类似于 VS 里面配置的可直接运行的插件(有知道的可以在评论区说一下)
- TRAE CN 因为本地是 Java 8 环境,直接运行会报 Java 相关问题
- Android Studio 里面的插件修改问题,单一修改可以自己处理,但复杂的多模块多文件修改无法自动处理,太麻烦。
Java 配置
新版的 Studio 要求 Java 版本为 JRE 17,但本地是 Java 8 环境用于开发后台项目。这里需要通过

为了 TRAE CN 也能直接使用,需要在gradle.properties中进行如下配置:
ini
org.gradle.java.home=D:\\develop\\Android Studio Narwhal\\jbr
你需要将这个路径替换为自己的路径
调整 Maven
这里调整 Maven,实际上还是网络问题导致的 ------ 网络无法连接 VPN,只能通过国内镜像下载最新的 Gradle 和 AGP

这里主要是配置阿里云的镜像,在buildscript里面的repositories和allprojects里面的repositories进行如下配置

这是我的配置:
rust
buildscript {
repositories {
// 阿里云 Google 仓库(优先,Android 核心库依赖)
maven { url 'https://maven.aliyun.com/repository/google' }
// 阿里云 MavenCentral 仓库(替代 jcenter,Gradle 7+ 主推)
maven { url 'https://maven.aliyun.com/repository/maven-central' }
// 阿里云公共仓库(补充其他第三方库)
maven { url 'https://maven.aliyun.com/repository/public' }
// 阿里云 JCenter 仓库(若项目依赖旧版 jcenter 库,需保留)
maven { url 'https://maven.aliyun.com/repository/jcenter' }
// 官方仓库(备选)
google()
mavenCentral()
maven {url "https://jitpack.io"}
maven {url 'https://developer.huawei.com/repo/'}
}
dependencies {
//noinspection GradleDependency
classpath 'com.android.tools.build:gradle:8.5.0'
classpath 'com.huawei.agconnect:agcp:1.9.4.300'
}
}
allprojects {
repositories {
// 与 buildscript 保持完全一致,确保所有模块都优先走阿里云
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/maven-central' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
google()
mavenCentral()
maven {url "https://jitpack.io"}
maven {url 'https://developer.huawei.com/repo/'}
}
}
调整依赖
这一步就是调整公共 Gradle 里面的依赖了,包括但不限于compileSdkVersion、minSdkVersion、targetSdkVersion这几个,以及其他 AndroidX 的包。
这里调整相关版本,通过 TRAE CN 的 Builder 模型自动进行。但有一点,AI 配置的版本有时候是不存在的,运行报错时,即使在对话中添加 "版本需存在" 等要求,也无法很好控制。
当然也尝试了切换 Builder 模式为 Android 智能体,对话过程整体感觉不如 Builder,应该是自己的智能体提示词写得不是很好,没有再深入研究~~
构建
实际上经过上述三步,项目已经可以尝试构建了。通过 Studio 构建过程中报错,然后将错误放到 TRAE CN 上,有时候也会直接在插件里查看,这里需要经过多轮对话,实际上工作间隙看一眼 AI 修改的内容,调整一下方向就行。

第一次构建后
这里主要是修改构建脚本中不再支持或需调整的属性:
- 移除
buildToolsVersion设置 - 修改 Java 版本配置,确保使用 JavaVersion.VERSION_17 或更高
- 移除
extension.project.tasks.whenTaskAdded中的mockableAndroidJar任务禁用配置 - 调整
setDependencies方法中的注解处理器配置 - 移除
dexOptions中的javaMaxHeapSize设置
arduino
// 修改前
dexOptions {
javaMaxHeapSize "4g"
}
// 修改后 - 完全移除
- 调整
buildTypes中的debuggable属性设置位置 - 检查
applicationVariants.all中的输出文件名设置
arduino
// 修改前
applicationVariants.all { variant ->
variant.outputs.all { output ->
***
def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith('.apk')) {
outputFileName = fileName
}
}
}
// 修改后
applicationVariants.all { variant ->
variant.outputs.all { output ->
***
// 直接设置 outputFileName,不再检查 outFile
outputFileName = fileName
}
}
- 检查
buildTypes中的配置,确保与 Gradle 8.0+ 兼容 - 移除或更新所有已弃用的 Gradle API 调用
- 确保所有第三方插件版本兼容 Gradle 8.7
- 检查
signingConfigs配置,确保路径和密码配置正确 - 移除所有注释掉的、不再使用的插件配置
同时让 AI 写一份清单,对每个模块的 build 配置进行检查调整,确保没有任何遗漏。
命名空间的坑
添加 namespace 配置(Android Gradle Plugin 8.0+ 必需)
这里还是经验不足,应该让 AI 检查所有模块,在所有模块的 build.gradle 中添加后,AndroidManifest.xml 里对应的 package 属性需要移除。
这里自己忘了 AndroidManifest.xml 里的 package 定义和模块名没有进行详细的规则匹配,通过公共配置导致 R 文件一直生成不出来,而且后来又挨个模块修改了一遍。
果然以前的坑现在还要填。
中间需要注意:TRAE CN 修改过程中遇到问题会自行修改 Java 版本,从 JRE 17 改成 8,出现过多次,需要手动干预。
switch R.id. 的问题
这里还是项目太老的问题,以前很多点击事件都是通过 switch (v.getId ()) { case R.id.A: ... } 这种方式写的,现在都报错了。
需要将 switch 语句转换为 if-else 结构:
Android Gradle插件或构建工具更新:新版本的构建工具可能对资源ID的可见性处理更加严格,限制了对嵌套布局资源ID的直接访问。

找到了修改方式,后续就让 AI 挨个文件找到修改位置并修改即可。
exported 的问题
这里之前很多第三方 Service 或者 Activity 需要明确设置android:exported属性,这些让 TRAE CN 运行检查并修改就行。
总结
经过上述在 TRAE CN 中的多次沟通,并在沟通中指定 Android SDK 位置,最终实现将 APK 运行到手机上。


但是希望TRAE CN能优化一下,在电脑上遇见多次卡死的情况。