multidex分包配置maindex的方法

聲明主 DEX 文件中需要的類

為 Dalvik 可執行文件分包構建每個 DEX 文件時,構建工具會執行復雜的決策制定來確定主要 DEX 文件中需要的類,以便應用能夠成功啟動。如果啟動期間需要的任何類未在主 DEX 文件中提供,那么您的應用將崩潰并出現錯誤java.lang.NoClassDefFoundError。

該情況不應出現在直接從應用代碼訪問的代碼上,因為構建工具能識別這些代碼路徑,但可能在代碼路徑可見性較低(如使用的庫具有復雜的依賴項)時出現。例如,如果代碼使用自檢機制或從原生代碼調用 Java 方法,那么這些類可能不會被識別為主 DEX 文件中的必需項。

因此,如果您收到java.lang.NoClassDefFoundError,則必須使用構建類型中的multiDexKeepFilemultiDexKeepProguard屬性聲明它們,以手動將這些其他類指定為主 DEX 文件中的必需項。如果類在multiDexKeepFile或multiDexKeepProguard文件中匹配,則該類會添加至主 DEX 文件。

multiDexKeepFile 屬性

您在multiDexKeepFile中指定的文件應該每行包含一個類,并且采用com/example/MyClass.class的格式。例如,您可以創建一個名為multidex-config.txt的文件,如下所示:

com/example/zyq/myapplication/MultidexMothod3.class

然后,您可以按以下方式針對構建類型聲明該文件:

multiDexKeepFile file('multidex-config.txt')

image

請記住,Gradle 會讀取相對于build.gradle文件的路徑,因此如果multidex-config.txt與build.gradle文件在同一目錄中,以上示例將有效。

multiDexKeepProguard 屬性

multiDexKeepProguard文件使用與 Proguard 相同的格式,并且支持整個 Proguard 語法。如需了解有關 Proguard 格式和語法的詳細信息,請參閱 Proguard 手冊中的Keep Options一節。

您在multiDexKeepProguard中指定的文件應該在任何有效的 ProGuard 語法中包含-keep選項。例如,-keep com.example.MyClass.class。您可以創建一個名為multidex-config.pro的文件,如下所示:

-keep class com.example.zyq.myapplication.MultidexMothod4

如果您想要指定包中的所有類,文件將如下所示:

-keep class com.example.** { *; } // All classes in the com.example package

然后,您可以按以下方式針對構建類型聲明該文件:

multiDexKeepProguard file('multidex-config.pro')

image

因為對MultidexMothod3和MultidexMothod4作了聲明

所以

image

這兩個類被打包在了主dex文件classes.dex中

image

剩余的1,2,5別打包在classes2.dex了

另外可能會遇到的問題:

  1. Dalvik LinearAlloc Limit

安裝時異常

Installation error: INSTALL_FAILED_DEXOPT

Please check logcat output for more details.

Launch canceled!

運行時異常

Application causes dalvik crash on gingerbread devices:

LinearAlloc exceeded capacity (8388608), last=6888

VM aborting Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1)

2. 首次安裝啟動時黑屏沒有響應/ANR

這個問題:是由于Multidex 分包之后,主Dex的包過大,啟動慢導致的。針對這個問題有以下解決方案:

(1).設置Multidex的分包參數,限制包的大小

a. --set-max-idx-number 用于限制每個dex的方法總數,設置為48000(經驗值)可解決2.X系統上multidex導致的LinearAlloc Limit問題。

b. --minimal-main-dex 設置此參數后可讓主dex的方法數盡可能的小,可以同--set-max-idx-number配合使用解決LinearAlloc Limit問題。

image
dexOptions {
javaMaxHeapSize "4g"
        additionalParameters = [//dex參數詳見 dx --help
                                '--multi-dex',//多分包
                                '--set-max-idx-number=45000',//每個包內方法數上限
//                                '--main-dex-list='+projectDir+'/maindexlist.txt',//打包進主classes.dex的文件列表
//                                '--minimal-main-dex'//使上一句生效
        ]
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容