启用MultiDex解决Unity2019.3.x构建Android游戏时Dex 64K引用限制问题

本文分享了在Unity项目升级到2019.3.6f版本后,解决构建Android版本时出现的dex文件方法数量超过64K限制的问题经验。通过修改Unity的Gradle配置文件启用MultiDex支持,成功解决了这一常见问题。
今天抽空将项目的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 { .. . }
以及Unity Forum上对这个问题的讨论: https://forum.unity.com/threads/cant-build-with-multidex-enabled.773348
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值