在开发APK重打包工具的时候,免不了要手动对dex文件进行分包,之前进行分包的时候,参考的是U8SDK的这一篇文章,但是实际测试下来发现,这种分包策略并不能很好的应对所有的情况
在走了一些弯路之后,我决定去分析 ApkTool 工具中的相关代码,研究 ApkTool 到底是如何检测Dex超出的
研究结果如下
ApkTool 一共会解析7种类型的引用计数,分别是
- String
- Type
- Field
- Method
- Proto
- CallSite
- MethodHandle
那我们要如何去解析Smali代码分别计算这7种类型的数量呢,答案在 Opcode 类里
这一行巨长,经过整理后大概会得到一个这样的格式,(整理过后的文本在文末的链接中)
NOP(0, "nop", 7, Format.Format10x, 4),
MOVE(1, "move", 7, Format.Format12x, 20),
MOVE_FROM16(2, "move/from16", 7, Format.Format22x, 20),
MOVE_16(3, "move/16", 7, Format.Format32x, 20),
MOVE_WIDE(4, "move-wide", 7, Format.Format12x, 52),
MOVE_WIDE_FROM16(5, "move-wide/from16", 7, Format.Format22x, 52),
MOVE_WIDE_16(6, "move-wide/16", 7, Format.Format32x, 52),
MOVE_OBJECT(7, "move-object", 7, Format.Format12x, 20),
MOVE_OBJECT_FROM16(8, "move-object/from16", 7, Format.Format22x, 20),
MOVE_OBJECT_16(9, "move-object/16", 7, Format.Format32x, 20),
......
根据这个类的构造函数,我们可以知道 其中括号中的第三个数据就是我们要找的类型码
Opcode(int opcodeValue, String opcodeName, int referenceType, Format format, int flags)
那么接下来的思路就很清晰了,我们只需要分门别类的将不同关键字去与Smali匹配,并且计算并分包即可。