65k methods limit

Dalvik 65K methods limit
你很快就会遇到的,不过放心,multidexing
会帮助你。
什么是Dalvik 65K methods limit?我们知道,我们写完java code之后,dx tool会把java编译的class文件再编译成Dalivik虚拟机能识别的DEX文件,这个文件里最多能够索引65536个method。关于这个有两点要注意:

  1. 这些method是指能够索引(reference)到的,而不是定义(define)
    的。或者说,如果你定义了一个方法,但这个方法并没有被调用,那么就不算在内。
  2. 这些method不仅仅是开发人员自己写的,还包括所有第三方library里面的method。

索引是用一个链表结构存储的,类型是short,short占2字节,16位,2^16=65536,所以,我们总共可以索引65536
个方法,包括自己写的和引入第三方库里的。
那么,我们如何能快速知道我们的app里已经有多少个method了呢?

  • bash script: dex-method-counts。这个工具可以快速计算,并且提供一个清晰的视图来阅读。
  • dex.sh by Jake Wharton。这个工具由于采用了递归算法,所以耗时比较长。(Jake大神还写了一篇有趣的分析文章Play Services 5.0 Is A Monolith Abomination,针对Play Services 5.0太大的问题进行了分析,有空时我再翻译下给各位。虽然Play Services 6.5已经模块化,更加轻量级了)。

现在,既然我们已经知道了自家app里的method数了,那么如何来处理这种情况呢?(官方做法、减少方法数、分包、插件化、增大可容纳的方法数)

  • Multidex,官方提供的解决方案(这个jar包最低可以支持到API 4的版本,5.0及以上版本默认支持),这篇文章里有详细的使用方法,此不赘述(使用Multidex support library)原理:将Multidex作为基本的dex,用它再去管理其他的dex。
  • ProGuardProGuard
    可以把code里unnecessary的method移除,压缩apk,当然还有代码混淆
    的奇效。
  • 使用H5文件代替一部分的逻辑代码。
  • 再创建一个DEX File
    。把app里可以独立的模块或code提取出来,放到一个独立的dex文件里,你可以使用Custom ClassLoader来加载这些类,然后使用接口
    或反射
    来调用这些方法。不过,这个过程还是比较麻烦的。
  • 插件化: https://github.com/singwhatiwanna/dynamic-load-apk
  • 如果使用eclipse,可以在Project.proterty中配置一句话就Ok啦, dex.force.jumbo=true,应该是暂时增大可容纳的方法数,也就是说方法在增大,还是会遇到问题,具体不是很了解,请各位大神指教!

你可能感兴趣的:(65k methods limit)