U8SDK——修正dex文件函数个数计算方式

作者: 分类: U8SDK 发布时间: 2016-05-08 22:45 62条评论

之前写的那篇处理dex文件中函数个数超出65K之后的自动分割dex的方法有一个问题(之前的文章),就是从smali文件中计算函数个数,和最终dex文件中计算的函数个数不一致,严格来说,是小了很多。

后来,研究了下,发现dex文件中所谓的函数个数65K上限,指的是除了dex中本身定义的函数之外,还包含引用的外部方法(这些方法主要就是android本身的一些函数)

所以,我就在查, dex中函数个数计算公式到底是啥。不过,官方文档给出的就是一个简单的说法,就是引用的函数个数(不重复的)

后来,没办法,只能自己做实验,写了一个简单的Android应用,打包成apk,看dex中的函数个数,然后再将dex通过打包工具转换为smali,再研究smali中怎么样计算才能和dex文件中函数个数匹配上。

经过一系列的试验,主要有如下几点:

1、所有定义的函数算一次,如果这个函数同时也被调用了,不再计算次数

2、重载的函数,算多次

3、多个子类中调用同一个父类的方法,如果直接调用,不加super.,算多次

计算要点确认之后,我们就可以着手在smali文件中按照这个规则来计算函数个事了。

smali文件的格式,方法定义是”.method”开头;方法调用是“invoke-”开头;方法参数列表是多个参数的拼接,无分割符,不过对于我们来说, 方法的本身就是(方法名称+参数列表),所以,我们不用分割方法和参数,而是将其整体作为一个方法,这样重载的方法就可以区分了。(有兴趣的同学可以去了解下smali文件格式)

针对这几点要素,我们重新调整了之前函数个数计算的方式,我们增加了一个smali_utils.py来处理smali相关的逻辑:

然后,我们在apk_utils.py中,将我们之前的splitDex这个方法也调整下,改为调用这个文件中的函数:

这样重新调整之后,测试了几个apk,和几个渠道,最终计算出来的函数个数, 和通过最终的dex比对,发现函数个数都是一致的。dex自动拆分功能也正常。

欢迎同学们进行测试, 如果有发现不一致的,请及时告诉我哦~~~

本文出自 U8SDK技术博客,转载时请注明出处及相应链接。

本文永久链接: http://www.uustory.com/?p=2069

评论功能已经关闭,请加入U8SDK技术群进行讨论和咨询:207609068
Ɣ回顶部
U8SDK技术群 x
技术同学请加入
点击加入