我们在完成 Android 12 适配之后主干 CI 集成打包没有问题,但在合入另一个需求的时候,立马就报 javac 编译失败,但只要把 compileSDK 降回 Android 11,他就没问题,然后我们针对该异常进行了各种 google,然后查到一篇 stackoverflow 的解决办法:
通过升级 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 编译就会失败呢?
通过肉眼去看,完全看不出来是什么问题导致,我们寻求了基础平台的帮助,基础平台的大佬通过下载 javac 1.8 的源码去编译这个中间类,立马定位到是一个 MODULE 的错误,然后查了一下这个 MODULE 是属于 @Deprecated 注解:
然后我们查了下 DaggerXXXApplication_HiltComponents 中是否有 @Deprecated 注解,确实找到了有:
注释也给的很明白,这是一个已定义但未使用到的模块,Hilt 插件会自动给该 module 打上 @Deprecated 注解,那这个 @Deprecated 注解又有什么问题呢?其实他的注释也给的很明白:
该模块的编译最少需要 jdk9 版本,真相大白,怪不得使用 jdk11 能编译通过。所以,我们将解决办法改成了,在组件中移除这个已定义但未使用的 module,这样,Hilt 就不会给方法生成 @Deprecated 注解,即可规避掉必须使用 jdk8 以上的问题。
总结:
虽然这次我们找到了是 @Deprecated 注解的问题,但不确定是否还有其他的注解也会跟 @Deprecated 一样,需要更高的 jdk 版本编译才能通过,所以,最好的方式还是提前预研 jdk11 在工程中的应用
版本编译才能通过,所以,最好的方式还是提前预研 jdk11 在工程中的应用
最后
按照国际惯例,给大家分享一套十分好用的Android进阶资料:《全网最全Android开发笔记》。
整个笔记一共8大模块、729个知识点,3382页,66万字,可以说覆盖了当下Android开发最前沿的技术点,和阿里、腾讯、字节等等大厂面试看重的技术。
因为所包含的内容足够多,所以,这份笔记不仅仅可以用来当学习资料,还可以当工具书用。
如果你需要了解某个知识点,不管是Shift+F 搜索,还是按目录进行检索,都能用最快的速度找到你要的内容。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照整个知识体系编排的。
(一)架构师必备Java基础
1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……
(二)设计思想解读开源框架
1、热修复设计
2、插件化框架设计
3、组件化框架设计
4、图片加载框架
5、网络访问框架设计
6、RXJava响应式编程框架设计
……
(三)360°全方位性能优化
1、设计思想与代码质量优化
2、程序性能优化
- 启动速度与执行效率优化
- 布局检测与优化
- 内存优化
- 耗电优化
- 网络传输与数据储存优化
- APK大小优化
3、开发效率优化
- 分布式版本控制系统Git
- 自动化构建系统Gradle
……
(四)Android框架体系架构
1、高级UI晋升
2、Android内核组件
3、大型项目必备IPC
4、数据持久与序列化
5、Framework内核解析
……
(五)NDK模块开发
1、NDK开发之C/C++入门
2、JNI模块开发
3、Linux编程
4、底层图片处理
5、音视频开发
6、机器学习
……
(六)Flutter学习进阶
1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter Dart语言系统入门
……
(七)微信小程序开发
1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战
……
(八)kotlin从入门到精通
1、准备开始
2、基础
3、类和对象
4、函数和lambda表达式
5、其他
……
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
目录 简介 背后的实现 Task.Wait 的两个阶段 SpinWait 阶段 BlockingWait 阶段 Task.Wait 可能会导致的问题 可能会导致线程池饥饿 可能会导致死锁 .NET 6 对 Task.Wait 的优化 总结 简介 Task.Wa…