Unity打包apk报错: Cannot fit requested classes in a single dex file (# methods: 73376 > 65536)的解决办法
文章目录
- 一、问题
- 二、原因
- 三、测试,生成超过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)的解决办法相关推荐
- 解决Cannot fit requested classes in a single dex file
详细描述 Cannot fit requested classes in a single dex file (# methods: 78458 > 65536) 原因 导出安装包时项目方法过多 ...
- Android 65536错误:Cannot fit requested classes in a single dex file
Cannot fit requested classes in a single dex file 问题 解决方法 完事 问题 AGPBI: {"kind":"error ...
- 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 ...
- Error:Cannot fit requested classes in a single dex file.。。。编译错误
最近欧啦在写项目中,studio编译运行项目会遇到拉个奇葩的错误,就是下边这个,在这里记载一下 Cannot fit requested classes in a single dex file. T ...
- AndroidX 方法数限制 Error:Cannot fit requested classes in a single dex file 64K问题
我使用的最新的AndroidX库报错了,方法数超过65536, 在AndroidX库中的MultiDex解决办法非常简单,只需要一步就可以解决. 在app的gradle里面的defaultConfig ...
- 出现VW自适应方案报错already has a ‘content‘ property, give up to overwrite it的原因及解决办法
出现VW自适应方案报错already has a 'content' property, give up to overwrite it的原因及解决办法 背景及原因 解决办法 文章参考 背景及原因 在 ...
- reactnative打包apk报错:failed parsing overlays.
笔者最近在进行项目打包的时候,遇到了这个如下的报错: 这个应该还是和aapt有关系,那么解决方法也就有了: 通过设置Android文件夹下面的gradle.properties文件中的:android ...
- 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 ...
- 闪退没由报错_使命召唤:(cod16)出现的闪退问题以及解决办法
<使命召唤16>无提示闪退桌面解决方法无提示闪退桌面怎么办(有其他问题可以评论留言哦,能解决的小鸿必定竭尽全力) 1.打开游戏看到主菜单后,不要进行游戏,直接按选项,在图形选单里,选择重新 ...
最新文章
- ES6 generator
- 地图统计_庄园地图“出镜率”排名,500场数据统计,红教堂第一
- 子系统单点登录配置说明
- 2019-06-03 Java学习日记之多线程下GUI
- sd卡插入计算机要格式化,内存卡一直提示格式化,内存卡插电脑要格式化-
- 802d简明调试手册_西门子数控系统828D简明调试手册.pdf
- Java项目:ssm在线答题系统
- 太阳能无线充电系统设计
- 微软 android启动器,微软启动器Mirosoft Launcher
- [presto(trino)]多种日期写法
- 软考中级哪个值得考?详细解答来了
- Apache Drill Architecture Introduction
- docker容器Linux环境下二维码图片中文字体乱码处理办法
- 做期货能不能尽量不止损?
- 苏州计算机活动,CCF苏州成功举办走进姑苏实验室活动
- 2018电子商务证书计算机基础知识,2018银行春招笔试高频考点—常识百科之计算机基础知识...
- 图像处理之图像变换(放缩、平移、旋转、仿射变换、透视变换)
- 单片机节日彩灯实训报告_基于单片机的节日彩灯设计论文课程设计.doc
- CUDA报错:unknown error - this may be due to an incorrectly set up environment, e.g. changing env varia
- 可节省60% MCU开发成本的NV080D-S8,单片机语音芯片在恒温碗上的应用