Notifications
Article
启用MultiDex解决Unity2019.3.x构建Android游戏时Dex 64K引用限制问题
Updated 12 days ago
25
3
问题现象:Unity 2019.3.x版本在构建Android游戏时报dex 64k引用错误:
今天抽空将项目的Unity版本升级到了2019. 3.6f ,毕竟是大版本升级,做好了心理准备要对编译环境和代码做一次大调整的,意料之外还颇为顺利,只踩了2~3个小坑,这里记录下其中的一个,如果你也遇到相同的问题,希望本文可以有所帮助。
升级到Unity 2019.3.6f版本后,Jenkins服务器在构建Android版本时报下面的错误:
stderr[ D8: Cannot fit requested classes in a single dex file (# methods: 93859 > 65536) FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':launcher:transformDexArchiveWithExternalLibsDexMergerForRelease'. > com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: The number of method references in a .dex file cannot exceed 64K
熟悉Android开发的同学对这个错误应该不陌生,Android 5.0之前的版本(API level < 21)使用Dalvik runtime 来执行代码,默认限制每个APK 只能使用一个classes.dex 文件,而DEX规范又将单个DEX文件内引用的方法总数限制为65536个,所以如果你游戏中使用了较多的第3方SDK,很容易就会超过这个限制。
这个问题我们之前也遇到过,解决的方法有三种:
(1)在Player Settings中将支持的最低Android API 级别设定为21及以上。Android API Level 21及更高版本支持从APK文件中加载多个DEX文件,因此不会受64K的限制。
(2)使用Custom Gradle 配置文件并启用MultiDex支持(在PlayerSettings>Publish Settings>Build 设置中勾选Custom Gradle Template,然后修改项目目录Assets/Plugins/Android/mainTemplate.gradle启用MultiDex支持)
(3)修改Unity Editor 默认的Gradle配置文件并启用MultiDex支持(Unity安装目录/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/mainTemplate.gradle)
我们项目之前使用的是第(3)种方法,即修改Unity Editor默认的Gradle配置文件mainTemplate.gradle,启用MultiDex,这种方法的好处是多个项目可以共享这个配置,坏处是每次升级Unity时都要重新修改一次。
于是我们按之前的方法修改了Unity3.6f的mainTeamplate.gradle文件并重新编译,但发现问题依然存在,经上网搜索查询后发现:原来在Unity3.x以上版本中,Unity增加了baseProjectTemplate.gradle 和 launcherTemplate.gradle 两个配置文件(我还搞不清楚增加的这两个配置文件的具体作用是什么,猜想launcherTemplate.gradle可能是用于构建独立应用时使用的,哪位同学如果知道还请赐教)。修改launcherTemplate.gradle启用MultiDex后,编译顺利通过。

下面是分别在Unity 2019.3.x之后及之前的版本中启用MultiDex的方法:

(1)在Unity 2019.3.x之后的版本(以2019.3.6f版本为例) ,修改
/Applications/Unity/Hub/Editor/2019.3.6f/PaybackEngines/AndroidPlayer/Tools/GradleTemplate/launcherTemplate.gradle
(2)在Unity 2019.3.x之前的版本(以2019.2.12f版本为例),修改
/Applications/Unity/Hub/Editor/2019.2.12f/PaybackEngines/AndroidPlayer/Tools/GradleTemplate/mainTeamplate.gradle

两个版本的配置文件,需要修改的地方都是相同的,如下:

第一步、在defaultConfig配置块中,增加“multiDexEnabled true”
android { defaultConfig { ... multiDexEnabled true minSdkVersion **MINSDKVERSION** targetSdkVersion **TARGETSDKVERSION** ... } ... }
第二步、如果你的项目没有使用AndroidX,那么添加以下支持库依赖项:
dependencies { implementation 'com.android.support:multidex:1.0.3' }
如果项目使用了AndroidX,那么添加下面的支持库依赖项
dependencies { implementation 'androidx.multidex:multidex:2.0.1' }
第三步、修改位于项目目录Asset/Plugins/Android/的AndroidManifest.xml文件,设置<application> 标记中的 android:name,如下所示:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application android:name="android.support.multidex.MultiDexApplication" > ... </application> </manifest>
第四步、如果你的项目替换了Application类,那么还要更改这个类,添加扩展以支持MultiDexApplication
public class MyApplication extends MultiDexApplication { ... }
更多可以参考Google官方的设置建议:
https://developer.android.com/reference/androidx/multidex/MultiDexApplication
以及Unity Forum上对这个问题的讨论:
https://forum.unity.com/threads/cant-build-with-multidex-enabled.773348/
Ping Cheng
Programmer
1
Comments
Ping Cheng
9 days ago
xunshuhi, 中文博客请在unity.cn发布->unity.cn/articles
好,我已经转发到中文博客了,后面的博文在中文站点写
1
xunshu
Staff
9 days ago
xunshuhi, 中文博客请在unity.cn发布->unity.cn/articles
0
xunshu
Staff
9 days ago
hi, 中文博客请在unity.cn发布->unity.cn/articles
0