Unity中的MultiDex之后,APK dex中不存在字节码

问题描述 投票:1回答:1

我的Unity游戏出现错误,提示:

 E/Unity: AndroidJavaException:
     java.lang.NoClassDefFoundError: android.app.NotificationChannel

由于方法数量很大,我使用Gradle来apply MultiDex

我在Android Studio中分析了APK,并在dex代码中看到byteCode 不可用(请参见屏幕截图)

image

我在其他DEX中找不到此类。

multidex处理是否有问题,并且代码确实不在类路径中吗?

TL; DR

UnityMultiDex一起导致NoClassDefFoundError。为什么?

android android-studio unity3d android-multidex
1个回答
0
投票
如果您确实希望在主要dex(它首先启动并包含所有必需的方法)中存在一个类(或方法等),则应创建一个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') ... } } }

注意:此问题仅适用于MinSDK版本20或更低版本的应用(MinSDK 21或更高版本本身就使用ART来支持它)

Reference
© www.soinside.com 2019 - 2024. All rights reserved.