太多的字段引用:70613; 最大值是65536

Ker*_*man 11 android unity-game-engine android-multidex

我的项目使用这些插件:

  • OneSignal
  • GooglePlayServices
  • 调整
  • 谷歌分析
  • Unity IAP
  • Facebook SDK

几乎每个项目都使用这些插件.

但我超过现场参考计数

这是我的.aar文件列表 名单

我该怎么做才能减少参考数量?

Pro*_*mer 31

那么我该怎么做才能减少参考数量呢?

你有很多插件,有很多功能/字段.从Unity的编辑器中构建它时有一个限制,你已经达到了这个限制.

要减少引用计数,您必须删除一些这些插件,但我确定您需要它们,并且在这种情况下删除可能不是合适的解决方案.

此时实际解决此问题并为Android构建的唯一方法是将项目导出为Android项目,然后使用Android Studio构建它.这将删除Unity编辑器强加的参考限制.


编辑

我忘了提到你必须在导出后启用multidex.由于很多人每天都会遇到这个问题,所以我决定添加一个关于如何通过导出问题来解决这个问题的详尽说明,以及如何在不导出问题的情况修复.

通过出口项目进行修复

1A.将Unity项目导出为Android项目.

在此输入图像描述

1B.导入Android Studio:

在此输入图像描述

如果您在导入Android Studio时出现等级错误,如下所示:

错误:org.gradle.api.internal.tasks.DefaultTaskInputs $ TaskInputUnionFileCollection无法强制转换为org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection

在此输入图像描述

build.gradle文件的"buildscript"块中的"dependencies"块中,更改:

classpath 'com.android.tools.build.gradle.2.1.0'
Run Code Online (Sandbox Code Playgroud)

classpath 'com.android.tools.build:gradle:2.2.3'
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


如果导出项目并仍然得到相同的错误,则需要手动启用multidex.以下是Google 文档中的简化步骤,该文档将在错误中显示给您:

2.新增android:name="android.support.multidex.MultiDexApplication" >应用在标签的AndroidManifest.xml文件.

在此输入图像描述


3.新增compile 'com.android.support:multidex:1.0.1'"依赖"的块的build.gradle文件.

在此输入图像描述


4.新增multiDexEnabled true"defaultConfig"块是在所述"机器人"块的build.gradle文件.

在此输入图像描述

构建APK,看看它是否有效.如果引用计数错误消失,请在此处停止.


5.获取如下所示的GC开销异常?

java.lang.OutOfMemoryError:超出了GC开销限制

增加执行dex操作时将使用的堆大小.从此解决方案,将以下内容添加到build.gradle文件中的"android"块:

dexOptions {
    javaMaxHeapSize "4g"
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在没有出口项目的情况下修复

必须具有Unity 5.5及更高版本才能执行此操作:

1.转到<UnityInstallationDirecory>\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\GradleTemplates,将mainTemplate.gradle文件复制到您的<ProjectName>Assets\Plugins\Android文件夹.


2.转到<UnityInstallationDirecory>\Editor\Data\PlaybackEngines\AndroidPlayer\Apk,将AndroidManifest.xml文件复制到您的<ProjectName>Assets\Plugins\Android


3.开均mainTemplate.gradleAndroidManifest.xml文件,您只需使用Visual Studio复制然后从做修改FIX通过导出项目上面的指令.跳过/忽略步骤#1A#1B.只需从#2#5执行步骤.而已.

就是决赛的mainTemplate.gradle样子,就是决赛的AndroidManifest.xml样子.这仅供参考.我建议你不要使用我的,而是按照上面的复制步骤创建你的,因为未来的Unity版本可以带有不同的文件.您想确保使用最新版本,否则可能会遇到问题.


4.建立APK并查看它是否有效:

在此输入图像描述

-

如果引用计数错误消失,请在此处停止:

5.获得如下所示的错误?

使用Gradle时必须签署构建失败版本构建

只需在Build Settings中Publishing Settings签名 apk即可.您可以创建新密钥库或使用现有密钥库.

在此输入图像描述


6.下面的另一个错误?

错误:避免硬编码调试模式; 将其删除允许调试和发布版本自动分配一个[HardcodedDebugMode]

android:debuggable="true">AndroidManifest.xml文件中删除.


如果此非导出解决方案不适合您,则必须使用导出解决方案.


lys*_*cid 5

IMO,接受的答案不正确(或仅部分正确).导出Android工作室不会"神奇地"修复此问题.此外,根据我的经验,导出的Android工作室项目并不总是立即构建,您必须先修复很多东西才能实际构建它.

您正在使用大量插件,因此您遇到了Android限制,无法引用超过64k的方法.

您可以尝试解决此问题:

  1. 如果可能,删除其中一些插件(如已接受的答案中所述).
  2. 使用multidex.在过去,只有通过将项目导出到Android工作室并在那里构建它才能实现.从Unity 5.5开始,您可以使用Unity从Gradle构建项目.这意味着您可以创建自定义gradle文件,将游戏配置为使用Multidex.这不会减少方法引用计数,但它可以通过将本机Java计数分成多个dex文件来解决它.
  3. 使用ProGuard - 因为您可以使用Unity中的Gradle,您还可以定义ProGuard以运行和删除任何未使用的代码.