我的Unity游戏出现错误,提示:
E/Unity: AndroidJavaException:
java.lang.NoClassDefFoundError: android.app.NotificationChannel
由于方法数量很大,我使用Gradle来apply MultiDex。
我在Android Studio中分析了APK,并在dex代码中看到byteCode
不可用(请参见屏幕截图)
我在其他DEX中找不到此类。
multidex处理是否有问题,并且代码确实不在类路径中吗?
TL; DR
Unity与MultiDex一起导致NoClassDefFoundError
。为什么?
multidex-config
文件并将其添加到其中。因此,所需的代码将出现在主dex文件中。要为您的multidex定义自定义配置,请在应用multidex之后执行以下操作之一。
1。使用文本文件作为配置
multiDexKeepFile
中指定的文件每行应包含一个类,格式为com/example/MyClass.class
。例如,您可以创建一个名为multidex-config.txt
的文件,如下所示:com/example/MyClass.class
com/example/MyOtherClass.class
然后,您可以按如下所示为构建类型声明该文件:
android { buildTypes { release { multiDexKeepFile file('multidex-config.txt') ... } } }
[请记住,Gradle会读取相对于build.gradle文件的路径,因此,如果multidex-config.txt与build.gradle文件位于同一目录中,则以上示例适用。2。使用保护规则
multiDexKeepProguard文件使用与Proguard相同的格式,并支持整个Proguard语法。有关Proguard格式和语法的更多信息,请参阅Proguard手册中的“保留选项”部分。
您在
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
然后,您可以按如下所示为构建类型声明该文件:
android { buildTypes { release { multiDexKeepProguard file('multidex-config.pro') ... } } }
Reference注意:此问题仅适用于MinSDK版本20或更低版本的应用(MinSDK 21或更高版本本身就使用ART来支持它)