Android Library编译默认用JDK8,如何改回JDK6/7?
我维护Android库时也曾碰到过一模一样的情况——升级Gradle、SDK和Support Libraries后,不管怎么调整JDK版本设置,生成的AAR里的类始终是JDK8(主版本52)。下面是我排查和解决的几个核心方向,你可以逐个尝试:
1. 明确配置模块级编译选项,覆盖Gradle插件默认行为
新版Android Gradle插件(尤其是3.0+版本)会默认启用JDK8的部分特性,哪怕根项目设置了sourceCompatibility也可能被覆盖。一定要在你的库模块的build.gradle里显式配置Android专属的编译选项:
android { compileOptions { // 明确指定JDK7版本 sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 // 关键:如果启用了核心库脱糖(desugar),会强制依赖JDK8,需要关闭 coreLibraryDesugaringEnabled false } } // 如果使用maven-publish插件,确保发布任务继承上述配置 publishing { publications { maven(MavenPublication) { from components.release pom.properties { property("java.version", "1.7") } } } }
2. 排查依赖库的隐性JDK版本要求
新版Support Libraries(或AndroidX)的部分组件本身要求用JDK8编译,比如新版的appcompat、recyclerview等。你可以通过依赖树查看是否有传递依赖强制指定了JDK8:
./gradlew :your-library-module:dependencies
如果发现某个依赖库的compileOptions是JDK8,你有两个选择:
- 降级该依赖到支持JDK7的旧版本
- 如果必须使用新版本,可能需要接受JDK8编译(不过这和你的需求冲突,优先尝试降级)
3. 锁定Gradle使用的JDK环境
有时候Gradle会优先使用系统全局的JDK,忽略项目配置。你可以通过以下方式强制指定JDK7:
- 在项目根目录的
gradle.properties里添加:org.gradle.java.home=/path/to/your/jdk7 - 检查系统环境变量
GRADLE_JAVA_HOME或JAVA_HOME是否指向JDK7,避免Gradle自动拾取JDK8
4. 查看构建日志,定位编译任务的实际JDK版本
执行构建时添加--info参数,查看编译阶段实际使用的JDK版本:
./gradlew :your-library-module:assembleRelease --info | grep "Java version"
如果输出显示用的是JDK8,说明你的配置没有被编译任务正确读取,需要检查是否有其他第三方构建插件覆盖了编译选项。
5. 清理Gradle缓存,避免旧配置残留
Gradle的缓存经常会导致奇怪的问题,建议彻底清理后重新构建:
./gradlew clean rm -rf ~/.gradle/caches ./gradlew build
之后再提取AAR文件,用javap -verbose YourClass.class | grep "major version"验证主版本号是否变为51(JDK7)。
6. 检查代码中是否无意中使用了JDK8特性
如果你的代码里用了Lambda表达式、默认方法、Stream API等JDK8专属特性,哪怕设置了source/target为7,编译也会强制使用JDK8。可以用Lint检查:
./gradlew :your-library-module:lint
查看是否有"NewApi"或"LambdaLast"之类的警告,定位到使用JDK8 API的代码并修改。
内容的提问来源于stack exchange,提问作者Mohammad Ersan

