一、概述
Android 應用 (APK) 文件包含 Dalvik Executable (DEX) 文件形式的可執行字節碼文件,其中包含用來運行您的應用的已編譯代碼。Dalvik Executable 規范將可在單個 DEX 文件內可引用的方法總數限制在 65,536,其中包括 Android 框架方法、庫方法以及您自己代碼中的方法。在計算機科學領域內,術語千(簡稱 K)表示 1024(或 2^10)。由于 65,536 等于 64 X 1024,因此這一限制也稱為“64K 引用限制”,詳細介參考谷歌官方配置文檔。
谷歌中文官方配置使用文檔
二、Multidex使用簡單配置
// 1. Gralde 配置
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 29
multiDexEnabled true
}
...
}
dependencies {
implementation 'androidx.multidex:multidex:2.0.1'
}
// 2. 清單配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name="com.xxx.MyApplication" >
...
</application>
</manifest>
// 3. Application初始化
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
如果就這么簡單我寫這個也沒什么意義,最主要看下面的高配置,和我所遇到的坑。
四、將一些找不到的類打包到主Dex,使用multiDexKeepProguard 屬性
如果APP安裝失敗,調試日志出現 NoClassDefFoundError
、ClassNotFoundException
、NoSuchMethodException
等異常,就需要將這些找不到的類,配置到主的DEX 文件中,以至于在APP初始化的時候能找到這些類。
配置方法(和混淆(proguard)一樣):
在build.gradle文件同級目錄下創建一個
multidex-config.pro
(根據官方命名)配置文件。在文件中添加找不到的類,如下所示:
-keep class com.example.MyClass
如果想一次配置包下的類都打包到主Dex,還可以這樣寫:
-keep class com.example.** { *; }
在build.gradle文件配置
android {
buildTypes {
release {
multiDexKeepProguard file('multidex-config.pro')
...
}
}
}
- AOP過濾配置(針對一些特殊的場景)
aspectjx {
// 這里太關鍵了
exclude 'com.alipay'
exclude 'com.google.android.gms.analytics'
}
五、總結
- Multidex使用有很多坑,盡量將自己的APP去三方平臺做云真機兼容性測試。如阿里移動測試、testin云測試等,推薦去云測試上去做真機調試,調試完有調試日志。
- 在三方平臺用真機調試一些不能過的機型,調試運行失敗后,下載調試日志,就可以找到上面我講的那幾個錯誤。
- 如果沒有類找不到那些異常,對于下面這些錯誤:
DexOpt: --- END 'cn.xxx.xxx-1.apk.classes4.zip' --- status=0x000e, process failed
MultiDex installation failure
java.io.IOException: unable to open DEX file
是Dex太大,在低端機型加載失敗所致。如果你的Dex不能在小了,你就放棄這些機型吧(字節跳動有方案,不過還沒開源,有興趣可以去微信關注了解一下)。 -
看一下我的測試成果,其實還是有些機型不行的,但對我們APP的用戶來講,應該是沒什么影響的了。
測試成果.jpg