文章目录

  • 一、问题
  • 二、原因
  • 三、测试,生成超过65535个函数
  • 四、解决办法
    • 1、勾选Custom Gradle Template
    • 3、添加multiDexEnabled true
    • 4、添加multidex依赖
    • 5、修改AndroidManifest.xml
    • 6、Application类,继承MultiDexApplication
  • 五、打包测试

一、问题

Unity打包apk时报了如下的错

D8: Cannot fit requested classes in a single dex file (# methods: 73376 > 65536)
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:
The number of method references in a .dex file cannot exceed 64K
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html

二、原因

Android 5.0之前的版本(API level < 21)使用Dalvik runtime来执行代码,默认限制每个APK只能使用一个classes.dex文件,而DEX规范又将单个DEX文件内引用的方法总数限制为65536个,所以如果游戏中使用了较多的第三方SDK,很容易就会超过这个限制。

三、测试,生成超过65535个函数

如果你工程中没有这么多java函数,可以自己写个python脚本生成超过65535个函数,例:

import random
import osletters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'func_tamplate='''public void FUNC_NAME(){Log.d("LOG_TEST", "FUNC_NAME");}'''def rand_name():letter_cnt = random.randint(8,20)func_name = ''for letter_cnt in range(letter_cnt):func_name += random.choice(letters)return func_namedef gen_func():return func_tamplate.replace('FUNC_NAME', rand_name())def gen_java_class_file():java_file_txt='''
package com.linxinfa.javatest;
import android.util.Log;public class CLASS_NAME
{FUNC_TEXT
}
'''funcs = ''# 一个java文件含7000个方法for i in range(7000):funcs += gen_func()class_name = rand_name()java_file_txt = java_file_txt.replace('CLASS_NAME', class_name)java_file_txt = java_file_txt.replace('FUNC_TEXT', funcs)with open(class_name + '.java', 'w') as f:f.write(java_file_txt)if '__main__' == __name__:# 生成10个java文件,一个java文件含7000个方法,这样就超过65535个方法了for i in range(10):gen_java_class_file()

四、解决办法

办法1:在Player Settings中将支持的最低Android API级别设定为21及以上。Android API Level 21及更高版本支持从APK文件中加载多个DEX文件,因此不会受64K的限制。

办法2:使用Custom Gradle配置文件并启用MultiDex支持(在PlayerSettings > Publish Settings > Build设置中勾选Custom Launcher Gradle Template,然后修改项目目录Assets/Plugins/Android/launcherTemplate.gradle启用MultiDex支持)

办法3:修改Unity Editor默认的Gradle配置文件并启用MultiDex支持(Unity安装目录/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/mainTemplate.gradle

本文介绍方法2的做法。

1、勾选Custom Gradle Template

PlayerSettings > Publish Settings > Build设置中勾选Custom Launcher Gradle Template

此时Assets/Plugins/Android/目录中会自动创建一个launcherTemplate.gradle文件

3、添加multiDexEnabled true

打开launcherTemplate.gradle,在defaultConfig配置块中,增加multiDexEnabled true

android {defaultConfig {...multiDexEnabled true...}...}

4、添加multidex依赖

如果你的项目没有使用AndroidX

dependencies {implementation 'com.android.support:multidex:1.0.3'
}

如果项目使用了AndroidX,那么添加下面的支持库依赖项

dependencies {implementation 'androidx.multidex:multidex:2.0.1'
}

如下,是我的mainTemplate.gradle

// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAINapply plugin: 'com.android.application'dependencies {implementation project(':unityLibrary')implementation 'com.android.support:multidex:1.0.3'}android {compileSdkVersion **APIVERSION**buildToolsVersion '**BUILDTOOLS**'compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}defaultConfig {multiDexEnabled trueminSdkVersion **MINSDKVERSION**targetSdkVersion **TARGETSDKVERSION**applicationId '**APPLICATIONID**'ndk {abiFilters **ABIFILTERS**}versionCode **VERSIONCODE**versionName '**VERSIONNAME**'}aaptOptions {noCompress = ['.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**]ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"}**SIGN**lintOptions {abortOnError false}buildTypes {debug {minifyEnabled **MINIFY_DEBUG**proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG**jniDebuggable true}release {minifyEnabled **MINIFY_RELEASE**proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG**}}**PACKAGING_OPTIONS****SPLITS**
**BUILT_APK_LOCATION**bundle {language {enableSplit = false}density {enableSplit = false}abi {enableSplit = true}}
}**SPLITS_VERSION_CODE****LAUNCHER_SOURCE_BUILD_SETUP**

5、修改AndroidManifest.xml

修改位于项目目录Asset/Plugins/Android/AndroidManifest.xml文件,给application添加MultiDexApplication

android:name="android.support.multidex.MultiDexApplication"

如下

6、Application类,继承MultiDexApplication

如果你没有自己实现Application类,则跳过此步。

public class MyApplication extends MultiDexApplication { ... }

五、打包测试

打包apk,解压后,可以看到有多个dex

Unity打包apk报错: Cannot fit requested classes in a single dex file (# methods: 73376 > 65536)的解决办法相关推荐

  1. 解决Cannot fit requested classes in a single dex file

    详细描述 Cannot fit requested classes in a single dex file (# methods: 78458 > 65536) 原因 导出安装包时项目方法过多 ...

  2. Android 65536错误:Cannot fit requested classes in a single dex file

    Cannot fit requested classes in a single dex file 问题 解决方法 完事 问题 AGPBI: {"kind":"error ...

  3. Cannot fit requested classes in a single dex file. Try supplying a main-dex list.

    Android studio 打包时报错如下: Cannot fit requested classes in a single dex file. Try supplying a main-dex ...

  4. Error:Cannot fit requested classes in a single dex file.。。。编译错误

    最近欧啦在写项目中,studio编译运行项目会遇到拉个奇葩的错误,就是下边这个,在这里记载一下 Cannot fit requested classes in a single dex file. T ...

  5. AndroidX 方法数限制 Error:Cannot fit requested classes in a single dex file 64K问题

    我使用的最新的AndroidX库报错了,方法数超过65536, 在AndroidX库中的MultiDex解决办法非常简单,只需要一步就可以解决. 在app的gradle里面的defaultConfig ...

  6. 出现VW自适应方案报错already has a ‘content‘ property, give up to overwrite it的原因及解决办法

    出现VW自适应方案报错already has a 'content' property, give up to overwrite it的原因及解决办法 背景及原因 解决办法 文章参考 背景及原因 在 ...

  7. reactnative打包apk报错:failed parsing overlays.

    笔者最近在进行项目打包的时候,遇到了这个如下的报错: 这个应该还是和aapt有关系,那么解决方法也就有了: 通过设置Android文件夹下面的gradle.properties文件中的:android ...

  8. unity打包webgl报错及处理 IL2cpp/build/unityLinker.exe not run properly;IL2cpp.exe not run properly

    unity打包webgl中出现的错误及解决方法 第一个 IL2cpp.exe not run properly 第二个 IL2cpp/build/unityLinker.exe not run pro ...

  9. 闪退没由报错_使命召唤:(cod16)出现的闪退问题以及解决办法

    <使命召唤16>无提示闪退桌面解决方法无提示闪退桌面怎么办(有其他问题可以评论留言哦,能解决的小鸿必定竭尽全力) 1.打开游戏看到主菜单后,不要进行游戏,直接按选项,在图形选单里,选择重新 ...

最新文章

  1. ES6 generator
  2. 地图统计_庄园地图“出镜率”排名,500场数据统计,红教堂第一
  3. 子系统单点登录配置说明
  4. 2019-06-03 Java学习日记之多线程下GUI
  5. sd卡插入计算机要格式化,内存卡一直提示格式化,内存卡插电脑要格式化-
  6. 802d简明调试手册_西门子数控系统828D简明调试手册.pdf
  7. Java项目:ssm在线答题系统
  8. 太阳能无线充电系统设计
  9. 微软 android启动器,微软启动器Mirosoft Launcher
  10. [presto(trino)]多种日期写法
  11. 软考中级哪个值得考?详细解答来了
  12. Apache Drill Architecture Introduction
  13. docker容器Linux环境下二维码图片中文字体乱码处理办法
  14. 做期货能不能尽量不止损?
  15. 苏州计算机活动,CCF苏州成功举办走进姑苏实验室活动
  16. 2018电子商务证书计算机基础知识,2018银行春招笔试高频考点—常识百科之计算机基础知识...
  17. 图像处理之图像变换(放缩、平移、旋转、仿射变换、透视变换)
  18. 单片机节日彩灯实训报告_基于单片机的节日彩灯设计论文课程设计.doc
  19. CUDA报错:unknown error - this may be due to an incorrectly set up environment, e.g. changing env varia
  20. 可节省60% MCU开发成本的NV080D-S8,单片机语音芯片在恒温碗上的应用

热门文章

  1. OLAP介绍(zhuanzai)
  2. MySQL TRUNCATE 函数详解
  3. 面向对象的3个基本对象
  4. JAVA分页代码实例
  5. Derby ij工具
  6. 如何在Release状态下进行调试
  7. 真干货!综合概述:网络营销怎么做?网络营销有哪些方式?
  8. 图片裁剪_如何裁剪某张图片的某一部分
  9. 前端开发实习面试题(JavaScript篇)
  10. Android自定义控件实战——滚动选择器PickerView