kirin77 发表于 2022-1-26 22:15

启用MultiDex解决Unity2019.3.x构建Android游戏时Dex 64K ...

今天抽空将项目的Unity版本升级到了2019. 3.6f ,毕竟是大版本升级,做好了心理准备要对编译环境和代码做一次大调整的,意料之外还颇为顺利,只踩了2~3个小坑,这里记录下其中的一个,如果你也遇到相同的问题,希望本文可以有所帮助。
问题现象:Unity 2019.3.x版本在构建Android游戏时报dex 64k引用错误:


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/

zt3ff3n 发表于 2022-1-26 22:19

你好请问大佬我按照你的步骤添加了设置 还是会报dex问题 是什么原因呢?我是通过as打aar 导入unity的方式和这个有关系吗?

FeastSC 发表于 2022-1-26 22:20

报错信息是什么啊?试试看不要改Unity Editor 默认的Gradle配置文件,在Player Settings中勾选Custom Launcher Gradle Template然后修改Asset目录下的launcherTemplate.gradle
页: [1]
查看完整版本: 启用MultiDex解决Unity2019.3.x构建Android游戏时Dex 64K ...