聲明主 DEX 文件中需要的類
為 Dalvik 可執行文件分包構建每個 DEX 文件時,構建工具會執行復雜的決策制定來確定主要 DEX 文件中需要的類,以便應用能夠成功啟動。如果啟動期間需要的任何類未在主 DEX 文件中提供,那么您的應用將崩潰并出現錯誤java.lang.NoClassDefFoundError。
該情況不應出現在直接從應用代碼訪問的代碼上,因為構建工具能識別這些代碼路徑,但可能在代碼路徑可見性較低(如使用的庫具有復雜的依賴項)時出現。例如,如果代碼使用自檢機制或從原生代碼調用 Java 方法,那么這些類可能不會被識別為主 DEX 文件中的必需項。
因此,如果您收到java.lang.NoClassDefFoundError,則必須使用構建類型中的multiDexKeepFile或multiDexKeepProguard屬性聲明它們,以手動將這些其他類指定為主 DEX 文件中的必需項。如果類在multiDexKeepFile或multiDexKeepProguard文件中匹配,則該類會添加至主 DEX 文件。
multiDexKeepFile 屬性
您在multiDexKeepFile中指定的文件應該每行包含一個類,并且采用com/example/MyClass.class的格式。例如,您可以創建一個名為multidex-config.txt的文件,如下所示:
com/example/zyq/myapplication/MultidexMothod3.class
然后,您可以按以下方式針對構建類型聲明該文件:
multiDexKeepFile file('multidex-config.txt')
請記住,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')
因為對MultidexMothod3和MultidexMothod4作了聲明
所以
這兩個類被打包在了主dex文件classes.dex中
剩余的1,2,5別打包在classes2.dex了
另外可能會遇到的問題:
- 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問題。
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'//使上一句生效
]
}