我的AI搭档:从“年久失修”的AGP 3.4到平稳着陆AGP 8.0时代

背景

作为一个好几年没接触过 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里面的repositoriesallprojects里面的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能优化一下,在电脑上遇见多次卡死的情况。

相关推荐
飞哥数智坊33 分钟前
Cursor 2.1 发布实测:计划能点了,审查能用了,CR 花多少?我也替你试了
人工智能·ai编程·cursor
FrameNotWork1 小时前
#RK3588 Android 14 虚拟相机 HAL 开发踩坑实录:从 Mali Gralloc 报错到成功显示画面
android·车载系统
恋猫de小郭3 小时前
回顾 Flutter Flight Plans ,关于 Flutter 的现状和官方热门问题解答
android·前端·flutter
张风捷特烈3 小时前
FlutterUnit3.4.1 | 来场三方库的收录狂欢吧~
android·前端·flutter
e***58234 小时前
Spring Cloud GateWay搭建
android·前端·后端
x***13397 小时前
【MyBatisPlus】MyBatisPlus介绍与使用
android·前端·后端
n***54388 小时前
【MySQL】MySQL内置函数--日期函数字符串函数数学函数其他相关函数
android·mysql·adb
z***75159 小时前
【Springboot3+vue3】从零到一搭建Springboot3+vue3前后端分离项目之后端环境搭建
android·前端·后端
程序员陆业聪9 小时前
Android模拟器检测全面指南:从基础到高级策略
android