打包时异常错误 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
在出错的module的gradle文件配置文件中修改 :
dependencies { ... compile 'com.android.support:multidex:' ... }
在出错的module的gradle文件配置文件中修改 :
defaultConfig { ... multiDexEnabled true ... }
如果你没有自定义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" }