字段引用过多:70613;最大值为 65536

Too many field references: 70613; max is 65536

我的项目使用了这些插件:

几乎每个项目都会用到这些插件。

但我已经超出了字段引用计数

这是我的 .aar 文件列表

我应该怎么做才能减少引用计数?

So What should i do to decrease reference count ?

你有这么多插件,有很多functions/fields。从 Unity 的编辑器构建它时存在限制,您已达到该限制。

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

目前 唯一 真正解决这个问题并为 Android 构建的方法是 项目作为 Android 项目,然后使用 Android Studio 构建它。这消除了 Unity 编辑器施加的引用限制。


编辑

忘了说导出后必须开启multidex。由于每天都有很多人遇到这个问题,我决定添加一个详尽的说明,说明如何通过 导出它 以及如何 不导出它来解决它.

通过导出项目修复

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

1B。导入 Android Studio:

如果在导入 Android Studio 时出现评分错误,如下所示:

Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection

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

classpath 'com.android.tools.build.gradle.2.1.0'

classpath 'com.android.tools.build:gradle:2.2.3'


如果导出项目后仍然出现相同的错误,则需要手动启用 multidex。以下是 Google 的 doc 的简化步骤,将在错误中显示给您:

2.将android:name="android.support.multidex.MultiDexApplication" >添加到 application 标签在 AndroidManifest.xml 文件中。


3.在[=]"dependencies"块中添加compile 'com.android.support:multidex:1.0.1'[=] 218=] 文件.


4。将 multiDexEnabled true 添加到 "defaultConfig" 块中,该块位于 "android" build.gradle 文件中的块。

构建 APK 并查看它是否有效。如果引用计数错误消失了,就到此为止。


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

java.lang.OutOfMemoryError: GC overhead limit exceeded

增加执行 dex 操作时将使用的堆大小。从这个 solution,将以下内容添加到 build.gradle 文件中的 "android" 块:

dexOptions {
    javaMaxHeapSize "4g"
}

修复而不导出项目

必须有 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。打开您刚刚用 Visual Studio 复制的 mainTemplate.gradleAndroidManifest.xml 文件,然后从 [=144] 进行修改=]通过导出上面的项目 指令进行修复。 Skip/Ignore 步骤 #1A#1B。只需执行从 #2#5 的步骤。而已。

This is what the final mainTemplate.gradle should look like and this is what the final AndroidManifest.xml应该是这样的。这仅供参考。我建议 你不要使用我的 而是按照上面的复制步骤创建你的,因为未来的 Unity 版本可能带有不同的文件。您想确保您使用的是最新版本,否则您在构建它时可能会遇到问题。


4。构建 APK 并查看它是否有效:

--

如果引用计数错误没有了,到此为止:

5。出现如下错误?

Build Failure Release builds have to be signed when using Gradle

只需 sign 来自 发布设置 构建设置 中的 apk。您可以创建新的密钥库或使用现有密钥库。


6。另一个错误如下?

Error: Avoid hardcoding the debug mode; leaving it out allows debug and release builds to automatically assign one [HardcodedDebugMode]

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


如果这个非导出解决方案不适合你,那么你必须 使用导出解决方案。

IMO,接受的答案不正确(或仅部分正确)。导出 Android 工作室不会 "magically" 解决此问题。另外,根据我的经验,导出的 Android studio 项目并不总是立即构建,您必须在实际构建它之前修复很多东西。

您使用了很多插件,因此您面临 Android limitation 无法引用超过 64k 方法的问题。

您可以尝试一些方法来解决此问题:

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