解决Android中单个dex文件中方法数越界的问题

来源:互联网 发布:大连电视台直播软件 编辑:程序博客网 时间:2024/05/20 19:28

通常一个Android应用中单个dex文件所能包含的最大方法数为65536个,这包含FrameWork、依赖的第三方jar包以及应用本身代码中的所有方法。


一般来说一个简单的应用里面的方法很难达到65536这个值,但是对于一些比较大型的项目来说,65536也是比较容易达到的,一旦应用的方法数达到65536后,编译器就无法正常完成编译工作了并会抛出类似这样的异常:

UNEXPECTED TOP-LEVEL EXCEPTION:

com.android.dex.DexIndexOverflowException:method ID not in [0, 0xffff]:65536


还有一种情况是,方法数没有达到65536,编译也正常编译通过了,但是在低版本的手机上安装时却出现了异常终止:

E/dalvikvm : Optimization failed

E/installd : dexopt failed on '/data/dalvik-cache/data@app@com.xxx.xxx.multidextest-2.apk@classes.dex' res=63282

...

这是因为应用在安装时会通过一个dexopt的程序来优化dex文件,并且在优化过程中dexopt通常会给应用一个8M或16M的缓存区,但是在Android2.2和2.3中通常只有5MB,所以会出现尽管应用中的方法没有超过65536个,但是其存储空间可能有超过5MB,这时候就会出现这样的问题,导致安装失败。


所以如何解决这样的问题呢?

在Android5.0以前需要引入Google提供的android-support-multidex.jar,这个jar包可以在SDK目录下的extras/android/support/multidex/library/libs下面找到。

5.0以后:(AndroidStudio)

一、修改工程目录下的build.gradle文件:

defaultConfig {    applicationId "com.xxx.xxx"    minSdkVersion 14    targetSdkVersion 23    versionCode 1    versionName "1.0"    multiDexEnabled true//解决方法数量超过65536个时无法编译的问题}
dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    compile 'com.android.support:appcompat-v7:23.1.1'    compile 'com.android.support:multidex:1.0.0'}
二、在代码中添加支持multidex的功能(三种方法)

1、在manifest文件中指定Application为MultiDexApplication,如:

<application    android:name="android.support.multidex.MultiDexApplication"    android:allowBackup="true"    android:icon="@mipmap/ic_launcher"    android:label="@string/app_name"
2、让应用的Application继承MultiDexApplication,如:

public class App extends MultiDexApplication {......}
3、重写Application的attachBaseContext方法(该方法比onCreate要先执行):

@Overrideprotected void attachBaseContext(Context base) {    super.attachBaseContext(base);    MultiDex.install(this);}

通过以上修改,则可以顺利编译通过了。


0 0
原创粉丝点击