您的位置:首页 > 移动开发 > Android开发

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

2016-01-07 23:52 531 查看
通常一个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要先执行):

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


通过以上修改,则可以顺利编译通过了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息