记一次Gradle环境的编译问题与解决

./gradlew app:assembleDebug Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could not be reused, use --status for details > Configure project :app WARNING: The option setting 'android.defaults.buildfeatures.buildconfig=true' is deprecated. The current default is 'false'. It will be removed in version 10.0 of the Android Gradle plugin. To keep using this feature, add the following to your module-level build.gradle files: android.buildFeatures.buildConfig = true or from Android Studio, click: Refactor > Migrate BuildConfig to Gradle Build Files. > Task :SettingsLib:search:compileDebugJavaWithJavac FAILED

最近在做一个大迁移的工程,目标是从 AOSP 的整编系统里面去剥离 Settings 模块,解耦出来能在 Android Studio 以独立工程的方式运行出来 ,这其中的过程和困难会在后续的文章再说,今天的主题只说这个报错和解决。

前面铺垫了是因为 我在 android studio 的右上角的点击 GUI 的 gradle 编译成功后

但是在 terminal ./gradlew app:assembleDebug 是失败的,这让我很慌,(有人可能理解不了为什么慌,能run能通过GUI点击编译成功不就行了嘛,但是这样肯定是不够的,因为最终肯定要支持自动化CI/CD的,所以必须在 linux 环境 no desktop 也支持)因为这个工程相当于是我解耦攒出来的,依赖特别多,到底是我自己解耦的问题还是环境问实在的我心理也没底,而且前面的报错是那些 Conext Handler 的基础 android API 依赖报的错误,让我认为可能是 framework.jar 的前置依赖出了问题

但是看到的是报错中有部分这个提示:

xxx/SettingsLib/SchedulesProvider/src/com/android/settingslib/schedulesprovider/ScheduleInfo.java:20: 错误: 无法访问Context import android.content.Context; ^ 错误的类文件: xxx/Settings/.common_libs/framework.jar(/android/content/Context.class) 类文件具有错误的版本 65.0, 应为 61.0 请删除该文件或确保该文件位于正确的类路径子目录中。

这个 65 和 61 什么意思和区别,会不会找不到基础的 Android API 也是因为这个问题所引起? 那就先把这个问题解决了再试试。

有了方向之后去查明原因: 原来这个 framework.jar 是在系统整编的时候使用 Java 21 编出来的,也就是报错中的 65。但是我的本地 ubuntu Java 环境是 Java 17,这样导致 gradle 去打包编译的时候出现报错无法正常解释。

解决方案有2 :

  • 1 :重新整编译以 Java 17 的环境去打包 framework.jar , 然后放置回来再重新 sync 编译试试
  • 2 :调整本地环境到 Java 21 再去尝试编译

此处肯定选择调整本地环境,因为整编的系统环境是大家的公共环境,影响面很大,很多服务和系统应用全都依赖这个环境,而调整本地只影响本地或者是我当下这个模块

那按照方案2的方式调整

bash 复制代码
# Ubuntu/Debian
sudo apt install openjdk-21-jdk

# 切换默认 Java 版本
sudo update-alternatives --config java
sudo update-alternatives --config javac

# 验证
java -version   # 应显示 21.x.x
javac -version

然后在项目根目录的 gradle.properties 中指定:

properties

ini 复制代码
org.gradle.java.home=/usr/lib/jvm/java-21-openjdk-amd64

sync now 后重新编译,结果全通过了~

相关推荐
前端snow1 小时前
ai agent --- 文件存储
前端
Frag0ut1 小时前
Chrome四大版本获取及共存指南:Stable/Beta/Dev/Canary
前端·chrome·浏览器·dev·beta·canary·共存版
IT_陈寒2 小时前
SpringBoot自动配置坑了我一把,原来是这样绕过去的
前端·人工智能·后端
广州华水科技2 小时前
单北斗GNSS变形监测在大坝安全监测中的应用与优势
前端
zeng不错3 小时前
B站 173 个投稿活动看到眼瞎?我写了个扩展,主打一个精准打击
前端
Latchh3 小时前
前端导出的JPEG红字发糊,质量要拉到100才清楚
前端·图像处理·人工智能·计算机视觉
默_笙3 小时前
🚦 请三个 AI 考官给 RAG 打分:量化评估实战(下)
前端·javascript
Joy T3 小时前
聊天系统中五大ID的演进与实战解析
java·前端·人工智能·spring·agent入门
Seraphina365 小时前
DVWA(SQL注入-low,medium,XSS反射-low)
前端·数据库·笔记·sql·网络安全·web·xss
Access开发易登软件5 小时前
Access 导入 Markdown 表格:把文档里的数据写进表
前端·html·vba·markdown·access开发