目录

macOS 打包机大小写问题,导致的 crash

今天遇到了个神奇的问题!

测试反馈某一个渠道包,运行时 crash,其他渠道包都没问题

因为我们的渠道包的代码本质上是一样的,出现一个包有问题,其他包没问题的情况,实在百思不得其解

于是,拿到了出问题的 apk,查看了一下日志,发现根本原因是启动过程中加载的一个资源丢失了,apk 中也确实没有这个资源,而正常包又确实有这个资源,是不是很神奇!

AGP 的问题?

因为我们最近升级了 AGP 7.x,那首先怀疑到是不是 AGP 有些问题呢?

之前,我也分析过,在 AGP 4.2.0 以后,也会提供一定的混淆功能,难道会把资源混淆丢了??

最终,经过长时间的翻 aapt2 代码,看产物,最终发现,并没有什么问题

AndResGuard 的问题?

由于之前我们一直也都在使用 AndResGuard,难道是两个混淆功能冲突了么??

发现,本地测试,每次经过 AndResGuard 都会丢掉一个资源!

那基本就是这个原因了!

可是,转念一想,也不对,每一个渠道包都会经过 AndResGuard,为什么有的包是可以的,有的包不行呢?

如果每次经过 AndResGurad 优化,都会有丢掉资源的危险,那这应该是一个普遍问题!

无意之间解压了 APK

为了进一步查看产物,我们解压了 APK,结果有重大发现!

每当我们解压 APK 后,里面的一个叫做 agv.xml 的资源就丢失了!

而 AndResGuard 正好会有一个解压、重打包 APK 的流程,所以出现了问题!

那为什么,解压就丢了一个资源呢?

后来发现,原来 APK 中,有两个同名的混淆后的资源,叫做 AGV.xml 和 agv.xml

当 APK 解压时,因为电脑是 macOS 环境,macOS 不识别大小写,认为 AGV 和 agv 两个文件是同一个,导致了覆盖丢失!

而打渠道包时,我们的打包机有 macOS 也有 Linux,随机选择,所以有的包有的问题,而有的包没问题!

如何解决

可以将 macOS 改为识别大小写的文件系统,或者干脆打包机使用 Linux!

也可以关闭 AGP 的资源混淆

也可以关闭 AndResGuard