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

0 阅读3分钟

./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 编译成功后

image.png

但是在 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的方式调整

# 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

org.gradle.java.home=/usr/lib/jvm/java-21-openjdk-amd64

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