Android 12 编译之坑

简介: Android 12 编译之坑

我们在完成 Android 12 适配之后主干 CI 集成打包没有问题,但在合入另一个需求的时候,立马就报 javac 编译失败,但只要把 compileSDK 降回 Android 11,他就没问题,然后我们针对该异常进行了各种 google,然后查到一篇 stackoverflow 的解决办法:

image.png通过升级 jdk 版本为 11 即可解决该问题,然后我们先本地进行了实验,将 jdk 环境升到了 jdk11,确实打包没有问题,由于我们的平台打包机环境用的是 jdk8,所以,我们向基础平台化提出了希望能升级 jdk11 的请求,但基础平台化那边的反馈是,该 jdk11 并没有经过验证,并且该变更会影响到多个业务线的打包,风险过高,不予升级。这个也确实,为了完成一个需求的合入就要求升环境版本,非常不合理。


基础团队希望我们能先找到是需求合入的哪个问题导致,然后找出影响点进行修改。

由于我们的项目结构是组件化的模式,主工程依赖的都是 aar 业务组件,所以,发生 javac 的问题只能是主工程里面的几个 java 类,但主工程只有 2 个 java 类,一个是 Application,一个是 SplashActivity,问题开始缩小查找范围。


然后我们去 CI 平台仔细查看了异常日志,看到了这么一条报错:


Hilt_XXXApplicatiton.java:20: error:cannot find synbol
 return DaggerXXXApplication_HiltComponents_SingletonC.builder()
复制代码


然后我们去看了下我们的 Application 类,确实这次需求合入,有新增一个 hilt 注解:


@HiltAndroidApp
public class XXXApplication extends MultiDexApplication 
复制代码


在尝试将注解注释后进行打包,没有问题。好了,问题已经定位到,就是这个 Hilt 注解问题导致。


异常日志中的  DaggerXXXApplication_HiltComponents 类是通过 Hilt 的 apt 生成的 java 中间类,为啥这个中间类用 jdk8 编译就会失败呢?

image.png

通过肉眼去看,完全看不出来是什么问题导致,我们寻求了基础平台的帮助,基础平台的大佬通过下载 javac 1.8 的源码去编译这个中间类,立马定位到是一个 MODULE 的错误,然后查了一下这个 MODULE 是属于 @Deprecated 注解:


image.png

然后我们查了下 DaggerXXXApplication_HiltComponents 中是否有 @Deprecated 注解,确实找到了有:


image.png

注释也给的很明白,这是一个已定义但未使用到的模块,Hilt 插件会自动给该 module 打上 @Deprecated 注解,那这个 @Deprecated 注解又有什么问题呢?其实他的注释也给的很明白:

image.png

该模块的编译最少需要 jdk9 版本,真相大白,怪不得使用 jdk11 能编译通过。所以,我们将解决办法改成了,在组件中移除这个已定义但未使用的 module,这样,Hilt 就不会给方法生成 @Deprecated 注解,即可规避掉必须使用 jdk8 以上的问题。


总结:


虽然这次我们找到了是 @Deprecated 注解的问题,但不确定是否还有其他的注解也会跟 @Deprecated 一样,需要更高的 jdk 版本编译才能通过,所以,最好的方式还是提前预研 jdk11 在工程中的应用


目录
相关文章
|
2月前
|
Android开发
安卓SO层开发 -- 编译指定平台的SO文件
安卓SO层开发 -- 编译指定平台的SO文件
32 0
|
3月前
|
Java Shell Linux
Android——编译(一):编译make的基础知识
Android——编译(一):编译make的基础知识
68 0
|
3月前
|
Java Shell Linux
Android——编译(二):android.mk的相关知识
Android——编译(二):android.mk的相关知识
95 0
|
6月前
|
存储 传感器 定位技术
《移动互联网技术》 第四章 移动应用开发: Android Studio开发环境的使用方法:建立工程,编写源程序,编译链接,安装模拟器,通过模拟器运行和调试程序
《移动互联网技术》 第四章 移动应用开发: Android Studio开发环境的使用方法:建立工程,编写源程序,编译链接,安装模拟器,通过模拟器运行和调试程序
70 0
|
3月前
|
Shell Android开发
RK android13编译环境搭建与常用编译命令
RK android13编译环境搭建与常用编译命令
72 0
|
3月前
|
开发工具 Android开发
QGroundControl Qt安卓环境搭建及编译出现的问题
QGroundControl Qt安卓环境搭建及编译出现的问题
61 0
|
3月前
|
Java Go Android开发
Android——编译(三):android.bp的相关知识
Android——编译(三):android.bp的相关知识
157 0
|
4月前
|
编解码 Ubuntu Java
Android 编译Android7.0版本源码
Android 编译Android7.0版本源码
|
4月前
|
开发工具 Android开发 开发者
Android 项目编译 Gradle 配置说明
Android 项目编译 Gradle 配置说明
150 0
|
4月前
|
算法 Java 开发工具
Android 编译C++
Android 编译C++