zoukankan      html  css  js  c++  java
  • Android开发 Error:The number of method references in a .dex file cannot exceed 64K.Android开发 Error:The number of method references in a .dex file cannot exceed 64K

    前言

    错误起因:

    在Android系统中,一个App的所有代码都在一个Dex文件里面。

    Dex是一个类似Jar的存储了多有Java编译字节码的归档文件。

    因为Android系统使用Dalvik虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。

    这里需要强调的是,Dex和Jar一样是一个归档文件,里面仍然是Java代码对应的字节码文件。当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。

    这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多。 但是在早期的Android系统中,DexOpt的LinearAlloc存在着限制: Android 2.2和2.3的缓冲区只有5MB,Android 4.x提高到了8MB或16MB。当方法数量过

    多导致超出缓冲区大小时,会造成dexopt崩溃,导致无法安装.

    另外由于DEX文件格式限制,一个DEX文件中method个数采用使用原生类型short来索引文件中的方法,也就是4个字节共计最多表达65536个method,field/class的个数也均有此限制。对于DEX文件,则是将工程所需全部class文件合并且压缩到一个DEX文件期间,也就

    是Android打包的DEX过程中, 单个DEX文件可被引用的方法总数被限制为65536(自己开发以及所引用的Android Framework和第三方类库的代码).

    解决办法

    可以引入: compile 'com.android.support:multidex:1.+' 修改Application extends MultiDexApplication; 最后在build.gradle defaultConfig中加入:

    defaultConfig {
    multiDexEnabled true}

    以为到这里就是解决方案? 其实这样做事不好的,为什么呢? 引用这种方式的原理在于:生成的Apk中将包含多个dex文件。

    而且一次性加载这么多方法及其影响性能,两种方式才好解决:1.插件化开发 2.分包。

  • 相关阅读:
    提取ecshop的mysql类
    phpexcel读取excel的xls xlsx csv格式
    Awstats显示国家地区插件GeoIP安装
    GeoIP Legacy City数据库安装说明
    JavaArrayList和数组间的相互转换
    mysql 初步认识
    HTTP ContentType
    ibatis 增加调试方法
    你了解Java中的Future吗?
    Java 环境问题总结
  • 原文地址:https://www.cnblogs.com/aoximin/p/13993222.html
Copyright © 2011-2022 走看看