在遇到這個報錯前我并不知道 Android app里面的方法數是有限制的,這里說明一下,Android 平臺的 Java 虛擬機 Dalvik 執(zhí)行 Dex 程序時,使用的是 short 類型來索引 DEX 文件中的方法序愚。這就意味著單個 Dex 文件可被引用的方法總數被限制為64x1024, 即65536。其中包括:
- Android Framework的方法
- library的方法
- 我們自己寫的方法
去除重復包
我們在項目中常常都會用到 Library等限,然而 Library 的 build.gradle 和我們 app 的 build.gradle 引用了相同類型不同版本的包時就會有重復的包爸吮,下面上張圖,方便理解望门。
其中的 v4 包和 annotations 包引用了兩個不同的版本形娇,增加方法數量的同時也增加了 .apk 文件的大小,一般出現 The number of method references in a .dex file cannot exceed 64K 報錯時筹误,先看 External Libraries 里面是否有大量的重復包桐早,若有,將版本都設置成一致的基本能解決這個異常厨剪。若問題任然存在哄酝,可能是項目本身就比較大,也大量的使用了第三方框架等等祷膳。
分割 Dex 文件解決方法限制
打開app的 build.gradle
- 在dependencies 中添加
compile 'com.android.support:multidex:1.0.1'
- 在 defaultConfig 中添加
multiDexEnabled true
如:
android {
compileSdkVersion 25
buildToolsVersion '25.0.3'
defaultConfig {
applicationId "XXXXXX"
......
multiDexEnabled true
}
buildType {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
.......
'com.android.support: multidex:1.0.1'
}
- 在 AndroidManifest.xml 中的 application 標簽中添加
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
或者如果你的工程中已經含有 Application 類,那么讓它繼承 MultiDexApplication 類
public class App extends MultiDexApplication {
...
}
如果你的Application已經繼承了其他類并且不想做改動陶衅,那么還有另外一種使用方式:重寫attachBaseContext() 方法
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this) ;
}
參考文章
Android應用使用Multidex突破64K方法數限制
Android 出現 java.lang.NoClassDefFoundError錯誤的一種解決方案
Android開發(fā) Error:The number of method references in a .dex file cannot exceed ...