一携茂、概述
Android 應用 (APK) 文件包含 Dalvik Executable (DEX) 文件形式的可執(zhí)行字節(jié)碼文件祠饺,其中包含用來運行您的應用的已編譯代碼粘咖。Dalvik Executable 規(guī)范將可在單個 DEX 文件內(nèi)可引用的方法總數(shù)限制在 65,536,其中包括 Android 框架方法勉躺、庫方法以及您自己代碼中的方法癌瘾。在計算機科學領域內(nèi),術(shù)語千(簡稱 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安裝失敗逝变,調(diào)試日志出現(xiàn) NoClassDefFoundError
基茵、ClassNotFoundException
、NoSuchMethodException
等異常壳影,就需要將這些找不到的類拱层,配置到主的DEX 文件中,以至于在APP初始化的時候能找到這些類宴咧。
配置方法(和混淆(proguard)一樣):
在build.gradle文件同級目錄下創(chuàng)建一個
multidex-config.pro
(根據(jù)官方命名)配置文件根灯。在文件中添加找不到的類,如下所示:
-keep class com.example.MyClass
如果想一次配置包下的類都打包到主Dex掺栅,還可以這樣寫:
-keep class com.example.** { *; }
在build.gradle文件配置
android {
buildTypes {
release {
multiDexKeepProguard file('multidex-config.pro')
...
}
}
}
- AOP過濾配置(針對一些特殊的場景)
aspectjx {
// 這里太關(guān)鍵了
exclude 'com.alipay'
exclude 'com.google.android.gms.analytics'
}
五烙肺、總結(jié)
- Multidex使用有很多坑,盡量將自己的APP去三方平臺做云真機兼容性測試氧卧。如阿里移動測試桃笙、testin云測試等,推薦去云測試上去做真機調(diào)試沙绝,調(diào)試完有調(diào)試日志搏明。
- 在三方平臺用真機調(diào)試一些不能過的機型,調(diào)試運行失敗后闪檬,下載調(diào)試日志星著,就可以找到上面我講的那幾個錯誤。
- 如果沒有類找不到那些異常谬以,對于下面這些錯誤:
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不能在小了为黎,你就放棄這些機型吧(字節(jié)跳動有方案,不過還沒開源行您,有興趣可以去微信關(guān)注了解一下)铭乾。 -
看一下我的測試成果,其實還是有些機型不行的娃循,但對我們APP的用戶來講炕檩,應該是沒什么影響的了。