今天总算把安卓 apk 的 R.xxx 问题解决了。
问题是这样的,合作商(cp)对接了我的安卓 sdk,并出了 apk 包。但是发现该 apk 包运行即闪退。通过查看相关日志,提示有 R.xxx 的资源问题。究其原因,因为我的 sdk 使用的 R.xxx 的方式来获取 sdk 的资源。而 cp 那边说是因为改了包名,包体就获取不到资源了。
而反编译 apk 包,发现 apk 包体里面的 smali R 文件中的 id 与 public.xml 记录的 id 完全对不上。(有点好奇,既然对不上,cp 是怎么能成功打包的?)
初步评估,解决这个 R.xxx 的闪退问题,有下面两种方法:
- 重新出 sdk。将 sdk 获取资源的方式从 R.xxx 的调用方式改成使用工具类获取,如使用封装好的工具类 ResourcesUtil 来获取。再重新封装好 sdk 发 cp 替换即可。
-
使用脚本 来解决这个问题。首先先讲一下脚本的工作原理:
- 反编绎 apk 包,拿到所有 smali R文件中 rid;
- smali R 文件中的 rid 必须与 public.xml 中记录的 rid 值一一对应,否则 apk 运行会找不到资源;
- 隐藏的小细节:除了一一对应还不够,在修复这个问题的过程中,我还发现:public.xml 中不能存在 smali R 文件中没有的 rid,否则回编译会失败。即 public.xml 中如果存在多余的 rid 值,则必须删掉。
- 完成上面两步,再打包回编译、重新打包 apk 包,重新签名、对齐即可。
以上,感谢阅读!