首页 > 科技 >

从大团队并肩作战到小团队带头冲锋,苏宁App插件化应用实践(4)

2018-07-31 12:51:18 网络整理 阅读:187 评论:0

这样在最终的 classes.dex 中,里面的 R.class 文件对应的 Package ID 就是我们想要设置的 Package ID。

修改 arsc + xml 中的 Package ID

不同于上面通过 Hook Gradle 过程修改中间生成的 R 文件,arsc + xml 则是直接解压最终的 APK 并修改目标文件,然后重新签名。

首先我们需要对 APK 文件中的 arsc + xml 的文件格式有一定的认识,Android 为了充分减少 APK 自身的大小,在编译的过程中会对所有的资源进行重组 + 压缩。

例如 values 文件下的内容会被统一收集到 arsc 文件中,而不再以文件的形式存在;而 xml 也不再是原始的 xml 文件,xml 中内容会被进一步整合 + 复用。

而无论是 arsc 文件,还是 xml 文件,在它们内部都是通过一个个固定数据结构的 ResChunk 以嵌套 + 组合的形式各自存储着。

资源信息:每段 ResChunk 的内容都以 8 字节的 ResChunk_header 开头,用于描述 ResChunk 的类型 + 长度,如下图:

从大团队并肩作战到小团队带头冲锋,苏宁App插件化应用实践(4)

也就是说 arsc + xml 中的所有内容都可以被反向解析出来,当充分了解每个 ResChunk 的数据结构以及掌握 ResChunk 中哪些内容是需要修改的 Package ID,就可以相对轻松的完成对二进制文件的修改。

Library Chunk 插入

修改完 Package ID 后,还需要在 resources.arsc 文件中插入一段 Library Chunk ,如下图:

从大团队并肩作战到小团队带头冲锋,苏宁App插件化应用实践(4)

Library Chunk 在 Android 5.0 之后才出现,对应的类型如下图:

从大团队并肩作战到小团队带头冲锋,苏宁App插件化应用实践(4)

那么为什么需要插入 Library Chunk?原因是在 Android 5.0 之后,ResTable在获取资源信息时,如果资源含有 Parent(ResTable_map_entry,如 style),会验证 Parent 的 Package ID 是否合法,也就是 Package ID 是不是已经..过了。

相关文章