Android Dex 分包研究

在开发APK重打包工具的时候,免不了要手动对dex文件进行分包,之前进行分包的时候,参考的是U8SDK的这一篇文章,但是实际测试下来发现,这种分包策略并不能很好的应对所有的情况

在走了一些弯路之后,我决定去分析 ApkTool 工具中的相关代码,研究 ApkTool 到底是如何检测Dex超出的

研究结果如下

ApkTool 一共会解析7种类型的引用计数,分别是

  • String
  • Type
  • Field
  • Method
  • Proto
  • CallSite
  • MethodHandle

图1

那我们要如何去解析Smali代码分别计算这7种类型的数量呢,答案在 Opcode 类里

图2

这一行巨长,经过整理后大概会得到一个这样的格式,(整理过后的文本在文末的链接中)

  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)  

图4

那么接下来的思路就很清晰了,我们只需要分门别类的将不同关键字去与Smali匹配,并且计算并分包即可。

相关资料

U8SDK——修正dex文件函数个数计算方式
Smali格式表
分包功能源码
我的重打包工具

kisence

潮落江平未有风。