# 打包时异常错误 64K问题 , UNEXPECTED TOP-LEVEL EXCEPTION: ....

打包时异常错误 64K问题 , UNEXPECTED TOP-LEVEL EXCEPTION: ….

错误提示:
UNEXPECTED TOP-LEVEL EXCEPTION: ….
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

原因: Answer

   The Dalvik VM can have a maximum of 65536 methods per dex file, due to a memory allocation issue.

   While it is possible to fix this using multiple dex files, Facebook found another fix that they could deploy within their app to get around the    problem.

总之就是在产生dex文件的时候 , 方法超过64k的话, 64K 以后的方法无法运行, 于是打包失败

Android 存在 65536 问题:

1)Android 机器在应用的安装过程中,系统会运行 dexopt 工具,将 .dex 文件优化为 .odex 文件,其中 dexopt 工具使用了固定的缓冲区大小来保存方法的元信息,低版本的 Android 机器上该缓冲区非常小,所以一旦方法数过多会直接导致 dexopt 崩溃,应用无法运行。

2)Dalvik 指令集对于一个 .dex 文件只能保存 65536 个方法的索引,所以一个 .dex 文件即使可以拥有很多方法,但是那些多余的方法也都是无法运行的。详细信息可以阅读官方的 dalvik-bytecode 的 invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB 条目。

因此选择 Android 的第三库需要严格注意控制方法的总数量。

官方提供了使用proguard 来缩减代码的方法,

http://developer.android.com/tools/help/proguard.html

另外 就是用 multidex , 可以完美解决, 参考:
http://www.unjeep.com/q/461222804.htm
http://stackoverflow.com/questions/27377080/after-update-of-as-to-1-0-getting-method-id-not-in-0-0xffff-65536-error-i

  1. 在出错的module的gradle文件配置文件中修改 :

    dependencies { 
    ... 
       compile 'com.android.support:multidex:' 
       ... 
    }
    
  2. 在出错的module的gradle文件配置文件中修改 :

    defaultConfig { 
       ... 
    multiDexEnabled true 
    ... 
    }
    
  3. 如果你没有自定义App类的话, 修改Manifest文件, 在Application定义的里面加入

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

    如果你有自定义App类的话, 原本继承自android.app.Application, 现在改成

        android.support.multidex.MultiDexApplication
    

    如果你自定的App类继承其他的类, 不方便改继承的话, 那么, 复写下面方法

        public class MyApplication extends FooApplication { 
           @Override 
           protected void attachBaseContext(Context base) { 
              super.attachBaseContext(base); 
              MultiDex.install(this); 
           } 
        }
    

    另外, 应用可能会用光内存. 解决这个问题, 在配置文件中加入下面dex 选项到‘android’ 关键字段内

        dexOptions { 
           incremental true 
           javaMaxHeapSize "4g" 
        }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值