记一次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 后重新编译,结果全通过了~

相关推荐
传奇开心果编程2 小时前
【Flutter踩坑排雷】第25课:ScrollController 误用坑|跳转失效、监听泄漏与“控制器未附加”
android·flutter·ios·移动开发·跨平台·dart·声明式ui
treasure1404 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
jay神5 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
屏什么录5 小时前
长时间录屏中途崩溃:MP4 打不开的 6 种救回方案与参数设置
前端·音视频开发
慕容雪_6 小时前
Capacitor8-Android打包完整手册
android·打包·capacitor
code_Bo6 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
kyriewen6 小时前
AI 能把页面写出来,为什么改个需求就开始崩?
前端·javascript·人工智能
涛涛ing7 小时前
2026年最值得关注的前端变化,藏在“默认值”里
前端
亿元程序员9 小时前
太牛了!这AI做出来的游戏,居然还能变现!
前端
hellice9 小时前
闪传 FlashDrop 实战:我用 300 行 Node 代码做了个「4 位取件码」临时文件中转站
前端·产品