为 MultiDex 应用构建每个 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/MyClass.class
com/example/MyOtherClass.class
然后,您可以针对 build 类型声明该文件,如下所示:
android {
buildTypes {
release {
multiDexKeepFile file('multidex-config.txt')
...
}
}
}
请注意,Gradle 会读取相对于 build.gradle 文件的路径,因此如果 multidex-config.txt 与 build.gradle 文件在同一目录中,以上示例将有效。
multiDexKeepProguard 属性
multiDexKeepProguard 文件使用与 Proguard 相同的格式,并且支持全部 Proguard 语法。如需详细了解 Proguard 格式和语法,请参阅 Proguard 手册中的 Keep 选项一节。
您在 multiDexKeepProguard 中指定的文件应该在任何有效的 ProGuard 语法中包含 -keep 选项。例如 -keep com.example.MyClass.class。您可以创建一个名为 multidex-config.pro 的文件,如下所示:
-keep class com.example.MyClass
-keep class com.example.MyClassToo
如果您要指定软件包中的所有类,文件将如下所示:
-keep class com.example.** { *; } // All classes in the com.example package
然后,您可以针对 build 类型声明该文件,如下所示:
android {
buildTypes {
release {
multiDexKeepProguard file('multidex-config.pro')
...
}
}
}
[**
原文链接
**](https://developer.android.com/studio/build/multidex?hl=zh-cn)