问题
当初为了缩减应用安装包的大小在项目里集成了 AndResGuard,99% 情况下没有什么问题。但是有的第三方 SDK 中会使用 getIdentifier() 的形式去获取资源,因此如果没有对这部分资源进行白名单配置的话,第三方 SDK 内部就会报错,通常也会引起自己的应用崩溃。
方案
1. 只混淆自己项目的资源,不混淆第三方 SDK 资源
具体思路是:为自己项目所有的资源名字添加特定前缀,正常情况下,不会出现说第三方 SDK 的资源名字也存在相同前缀的情形,然后在 AndResGuard 的白名单配置中添加正则匹配,对于不属于自己项目的资源则不进行混淆。
这种方案优点是自己项目不会在资源混淆出错这个问题上受第三方 SDK 限制,问题可控性大大提高了,缺点是不混淆所有第三方 SDK 资源的话,应用安装包大小缩减的效果会减弱。
2. 找出所有通过类似 getIdentifier() 形式获取到的资源调用,添加进白名单
具体思路是:编写脚本工具,若需要对第三方 SDK 反编译则先进行反编译,然后静态扫描 SDK 中的代码文件,正则匹配出 getIdentifier() 的调用处(也许资源动态获取的方法还有其他),提取出资源名字,最后把资源名字添加进 AndResGuard 的白名单配置。
这种方案优点是所有资源可混淆从而使应用安装包大小能相对缩减更多,缺点是问题可控性没那么高,依然受第三方 SDK 影响,而且无法保证脚本能 100% 提取到所有资源动态调用处。
3. 综合使用方案 1 和 2
如果资源足够的情况下,其实可以综合使用方案 1 和 2,这样就能继续保证应用安装包缩减的效果,当然,还会继续受第三方 SDK 影响,但是可以通过持续优化工具来逐渐减少问题。