专栏名称: 复利大王
分享和推送Java/Android方向的技术和文章,让你成为这方面的大牛,让你每天都成长一点。同时,我们也会邀请BAT的大牛分享原创!
目录
相关文章推荐
复利大王  ·  国产美女的热舞 ·  2 天前  
复利大王  ·  J小姐,死于话多 ·  2 天前  
复利大王  ·  花旗中国区总裁被裁了 ·  2 天前  
51好读  ›  专栏  ›  复利大王

探讨 Android 方法数65536 问题的本源

复利大王  · 公众号  · android  · 2017-05-11 10:10

正文

请到「今天看啥」查看全文


与 class 格式类似,dex 用一段连续的空间存放方法的索引集,每个方法被一个 method_id_item 数据结构所描述,由 class_idx proto_idx name_idx 三个元素组成 [3,4], 它们分别代表方法所在类类型索引、方法声明的索引以及方法名的索引。

如下图所示,Dex 中所有方法均来自 Android 的 Java 代码(也不排除其他语言可以被编译为 dex 格式的情况),通过 Android 打包的 dx 工具,我们能将编译为 class 的 Java 文件转化为 dex。

定位 dex 方法的来源的关键在于找到其所属的 Java 文件,按图索骥可知 Java 文件的来源无非几种情况:

  • 引入的 aidl 文件

  • 参与编译的 Java 源码

  • 根据资源生成的 R 文件

  • 依赖的其他库(会被一同打入到编译结果的)

事实上我们工程中 99% 的方法都来自开发者创建的 Java 文件或者引入的库,那么 Java 这门语言到底会在哪些对方法数产生何种影响?


1.    调用的真相


定义方法的根本目的就是要调用它。为了说明调用方法的意义,下图给出一个简单的示例:声明两个类 MainActivity 和 Test,这两个类都有一个 foo 函数,里面执行了 Activity 的 startActivity。

反编译生成的 APK,得到 dex 对应的 smali 文件(smali 是 dex 的汇编器,和 dalvik 一样都是冰岛语,是一脉相承的东西)。可以看到调用 Activity 的 startActivity 的字节码出现在 Test 和 MainActivity 中。

那么这种方法的调用会不会增加 dex 的方法?先记录下当前的方法数为 24 个。







请到「今天看啥」查看全文