Eclipse中使用MultiDex解决单一dex文件的65535个方法数限制

Posted by afon on February 25, 2016

最近的项目中使用了一个 fullsync 同步器,这个同步器引用的库非常多,直接导致了方法个数超过了65535个,本文介绍如何在 Eclipse 中使用谷歌提供的android.support.multidex来解决这一问题。

预先测试

为了便于测试,先在 libvfssync 工程中写一个测试方法。

生成 classes2.dex

使用 android sdk 路径下的 build-tools/dx 命令,进入到 libvfssync 工程目录下的 bin 文件夹执行此命令,并把 libvfssync 工程依赖的库文件也包含进来。

dx --dex --output=classes2.dex libvfssync.jar ../libs/*

把生成的 classes2.dex 复制到主工程目录的 src 文件夹下

把 android-support-multidex.jar 复制到主工程的 libs 文件夹里面,android-support-multidex.jar 位于 android sdk 路径/extras/android/support/multidex/library/libs 里面。

此时还需要把 libvfssync.jar 引入到主工程中,设置为只依赖不编译。右键主工程 –> Properties –> Java Build Path,切换到 Libraries 选项卡,单击 Add Jars,添加 libvfssync 工程目录下的 bin/libvfssync.jar 文件,切换到 Orders and Export 选项卡,如果它是打勾的,取消打勾(这样就不编译这个 jar 到 apk 中)。

测试

在主工程中的 Application 类中加入以下代码。

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

加入测试代码。

我们看到,编译之后运行,在 logcat 中输出了测试的代码。

解压主工程生成的 apk,可以看到 classes2.dex 被打包进入了 apk 里面。

注意事项

在一些特殊的平台机器上,Application 类中调用 classes2.dex 定义的类和方法可能抛出 NoClassDefFoundError 异常。此时注意不要在 Application 类中调用。