Android 12 编译之坑

77 篇文章 0 订阅
55 篇文章 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 在工程中的应用

版本编译才能通过,所以,最好的方式还是提前预研 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、其他

……

图片

好啦,这份资料就给大家介绍到这了,有需要详细文档的小伙伴,可以微信扫下方二维码免费领取哈~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值