Android Multidex正確使用方式(不行就試試字節(jié)的解決方案)

一、概述

Android 應(yīng)用 (APK) 文件包含 Dalvik Executable (DEX) 文件形式的可執(zhí)行字節(jié)碼文件,其中包含用來(lái)運(yùn)行您的應(yīng)用的已編譯代碼。Dalvik Executable 規(guī)范將可在單個(gè) DEX 文件內(nèi)可引用的方法總數(shù)限制在 65,536,其中包括 Android 框架方法、庫(kù)方法以及您自己代碼中的方法。在計(jì)算機(jī)科學(xué)領(lǐng)域內(nèi),術(shù)語(yǔ)千(簡(jiǎn)稱 K)表示 1024(或 2^10)。由于 65,536 等于 64 X 1024,因此這一限制也稱為“64K 引用限制”,詳細(xì)介參考谷歌官方配置文檔。
谷歌中文官方配置使用文檔

二、Multidex使用簡(jiǎn)單配置
// 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);
  }
}

如果就這么簡(jiǎn)單我寫這個(gè)也沒什么意義,最主要看下面的高配置,和我所遇到的坑。

四、將一些找不到的類打包到主Dex,使用multiDexKeepProguard 屬性

如果APP安裝失敗,調(diào)試日志出現(xiàn) NoClassDefFoundErrorClassNotFoundException、NoSuchMethodException等異常,就需要將這些找不到的類,配置到主的DEX 文件中,以至于在APP初始化的時(shí)候能找到這些類。
配置方法(和混淆(proguard)一樣):

  1. 在build.gradle文件同級(jí)目錄下創(chuàng)建一個(gè)multidex-config.pro(根據(jù)官方命名)配置文件。

  2. 在文件中添加找不到的類,如下所示:
    -keep class com.example.MyClass

  3. 如果想一次配置包下的類都打包到主Dex,還可以這樣寫:
    -keep class com.example.** { *; }

  4. 在build.gradle文件配置

    android {
        buildTypes {
            release {
                multiDexKeepProguard file('multidex-config.pro')
                ...
            }
        }
    }
  1. AOP過(guò)濾配置(針對(duì)一些特殊的場(chǎng)景)
aspectjx {
    // 這里太關(guān)鍵了
    exclude 'com.alipay'
    exclude 'com.google.android.gms.analytics'
}
五、總結(jié)
  1. Multidex使用有很多坑,盡量將自己的APP去三方平臺(tái)做云真機(jī)兼容性測(cè)試。如阿里移動(dòng)測(cè)試、testin云測(cè)試等,推薦去云測(cè)試上去做真機(jī)調(diào)試,調(diào)試完有調(diào)試日志。
  2. 在三方平臺(tái)用真機(jī)調(diào)試一些不能過(guò)的機(jī)型,調(diào)試運(yùn)行失敗后,下載調(diào)試日志,就可以找到上面我講的那幾個(gè)錯(cuò)誤。
  3. 如果沒有類找不到那些異常,對(duì)于下面這些錯(cuò)誤:
    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太大,在低端機(jī)型加載失敗所致。如果你的Dex不能在小了,你就放棄這些機(jī)型吧(字節(jié)跳動(dòng)有方案,不過(guò)還沒開源,有興趣可以去微信關(guān)注了解一下)。
  4. 看一下我的測(cè)試成果,其實(shí)還是有些機(jī)型不行的,但對(duì)我們APP的用戶來(lái)講,應(yīng)該是沒什么影響的了。


    測(cè)試成果.jpg
六、試試用字節(jié)的BoostMultiDex項(xiàng)目

字節(jié)BoostMultiDex Github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、背景 隨著業(yè)務(wù)規(guī)模發(fā)展,不斷的加入新的功能,添加新的類庫(kù),app的方法數(shù)已經(jīng)超過(guò)65535,這樣的情況下就會(huì)遇...
    jiantao閱讀 18,831評(píng)論 6 50
  • Tinker 熱補(bǔ)丁接入過(guò)程中的坑?。?! =============== Tinker 介紹 官方接入說(shuō)明 gra...
    朱立志閱讀 2,254評(píng)論 0 2
  • 引言 如果App引用的庫(kù)太多,方法數(shù)超過(guò)65536后無(wú)法編譯。這是因?yàn)閱蝹€(gè)dex里面不能有超過(guò)65536個(gè)方法。為...
    喜歡丶下雨天閱讀 10,762評(píng)論 2 20
  • 申明. 本文章轉(zhuǎn)載于網(wǎng)絡(luò), 本人僅用于自我學(xué)習(xí)以及需要的朋友參考 一、遭遇MultiDex 愉快地寫著Androi...
    Candy有雪吃閱讀 3,620評(píng)論 1 7
  • 為什么需要對(duì)Dex進(jìn)行分包 Android在安裝應(yīng)用的過(guò)程中,系統(tǒng)會(huì)運(yùn)行一個(gè)名為DexOpt的程序?yàn)樵搼?yīng)用在當(dāng)前機(jī)...
    Boreas_su閱讀 4,447評(píng)論 0 9

友情鏈接更多精彩內(nèi)容