文档章节

64K方法数限制原理和解决方案

派赛克
 派赛克
发布于 2016/12/30 17:20
字数 545
阅读 516
收藏 23

概述

Android Dalvik可执行文件.dex中的Java方法数引用超过65536,64k的计算方法是65536除以1024,65K的计算方法是65536除以1000

原因

dex限制了程序的最大方法数是65535,如果超过最大限制,无法编译.

Android 5.0 之前的版本

谷歌出了一个名为MultiDex Support Library的库

Android 5.0 之后的版本

Android试用了名为ART的虚拟机来代替Dalvik虚拟机,ART支持从APK文件中加载多个.dex文件.
在安装期间,他会执行一个预编译操作,对.dex文件编译成一个个单一的.oat文件,在运行应用时去加载.oat文件,而不是.dex文件

解决方案一 减少方法数

不建议使用MultiDex Support Library来将APK中单一的dex拆分成多个,从而规避64k方法数限制引起的变异错误 ,因为会在大多数情况下降低应用的性能

1.减少不必要的依赖,对于lib的体积,方法数,性能进行考察,选择合适的库
2.使用Proguard移除无用的代码,配置并在Release版本中使能ProGuard,它的压缩功能通过分析字节码,能够检测并移除没有使用到的类,字段,方法和属性,

解决方案二 使用MultiDex

配置

在 Application Module 的build.gradle文件 增加对MultiDex的依赖

defaultConfig{
    multiDexEnabled true
}
dependencies{
    compile "com.android.support:multidex:1.0.1"
}

三种情况

1.如果项目没有自定义Application的类,只需要在AndroidManifest,xml文件使用MultiDexApplication替换Application即可,

android:name="android.support.multidex.multiDexApplication"


##### 2.如果应用已经有了自定义Application 那么让他继承MultiDexApplication
##### 3.如果不像或者不能修改他的父类,那么覆写attachBaseContext方法初始化MultiDex
>```
protected void attchBaseContext(Context context){
    super.attchBasaeContext(context);
    MultiDex.install(this);
}

总结

MultiDex在开发阶段会机打的影响到开发效率,建议最小支持5.0防止64k问题的发生,如有必要兼容Android 5.0以下版本,请充分做好测试.

© 著作权归作者所有

派赛克
粉丝 11
博文 17
码字总数 19055
作品 0
朝阳
程序员
私信 提问
64K方法数限制解决办法

随着业务逻辑越来越多,业务模块也越来越大,不可避免会遇到64K方法数的限制。最直观的表现就是编译报错: 较早版本的编译系统中,错误内容如下: 较新版本的编译系统中,错误内容如下: 64...

sinat_36668731
2017/07/27
0
0
Android 在 Multidex 下使用 Instant Run

Instant Run是Android studio 2.0新的逆天功能,在Run和Debug的时候,只有在第一次build会花费大量的时间,之后再次Run或者Debug的时候会直接把变化的代码更新到手机,再上面生成一个新的APK...

丁佳辉
2016/07/28
7
0
JVM中可生成的最大Thread数量

======================================== 更新: 网上查到的最大可创建线程数公式是: (MaxProcessMemory – JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads Ma......

Sub
2013/09/05
0
1
谷歌multiDex, 64K限制和LinearAlloc限制

-- 64K限制和LinearAlloc限制,Android著名的Dex 64k method数量上限,65536 LinearAlloc限制 ,即使方法数没有超过65536,能正常编译打包成apk,在安装的时候,也有可能会提示INSTALLFAILEDDE...

desaco
02/18
0
0
JVM可生成的最大Thread数量探索

最近想测试下Openfire下的最大并发数,需要开大量线程来模拟客户端。对于一个JVM实例到底能开多少个线程一直心存疑惑,所以打算实际测试下,简单google了把,找到影响线程数量的因素有下面几...

孟飞阳
2016/07/04
19
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式

//分静态代理和动态代理,区别:是否再编译时知道被被代理的对象 //思想,被代理类将自己的处理交给代理类,代理类可以添加一些新的功能,之后有代理类和客户端交互 https://www.cnblogs.co...

南桥北木
18分钟前
0
0
Spring系列教程七: Spring 整合mybatis的四种方式

一、使用注解实现整合mybatis 项目目录如下 第一步、导入jar包 <build> <resources> <!-- mapper.xml文件在java目录下 --> <resource> ......

我叫小糖主
23分钟前
5
0
阿里P7架构师:这些技术点没搞懂,我劝你不要跳槽!

阿里P7架构师架构师:这些技术点没搞懂,我劝你不要跳槽! 哪些技术点呢? 废话不多说,技术点全在下面这6张图里面了! 1.怎么看源码? 2.分布式 3.微服务 4.性能优化 5.工程化 粉丝福利:一...

别打我会飞
42分钟前
4
0
易错题

父类必须有一个无参构造,不然会报Implicit super constructor Parent() is undefined. Must explicitly invoke another constructor...

architect刘源源
46分钟前
1
0
使用Json4s 将带有Timestamp的对象转json时 变为所在时区

在有Timestamp属性的对象转json时 最后出来的时间会减小8小时,是因为变成了0时区,需要将隐式转换中添加设置本地时区 import org.json4s.{DefaultFormats, Formats}import org.json4s.jac...

可达鸭Go
48分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部