【问题标题】:Too many field references: 70613; max is 65536字段引用过多:70613;最大值为 65536
【发布时间】:2017-03-03 15:33:49
【问题描述】:

我的项目使用这些插件:

  • OneSignal
  • GooglePlay 服务
  • 调整
  • 谷歌分析
  • Unity IAP
  • Facebook SDK

这些插件几乎用于每个项目。

但我超过了字段引用计数

这是我的 .aar 文件列表

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

【问题讨论】:

  • 当您的项目文件增加时,android studio 会出现这种类型的错误,然后 android studio 需要一些插件,并且使用该插件到 android studio 可以让您在项目中存储更多文件。和 android 项目为您提供仅存储 65536 个文件而无需此插件。点击查看您的解决方案:stackoverflow.com/questions/42582850/…

标签: android unity3d android-multidex


【解决方案1】:

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

你有这么多具有​​许多功能/领域的插件。从 Unity 的编辑器构建它时有一个限制,您已经达到了这个限制。

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

目前真正解决这个问题并为 Android 构建的唯一方法是export 将项目作为 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'

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


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

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


3。将compile 'com.android.support:multidex:1.0.1' 添加到build.gradle 文件中的“dependencies” 块中。


4.将multiDexEnabled true添加到build.gradle文件中“android”块中的“defaultConfig”块.

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


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

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

增加执行 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 文件,然后按照上面的FIX BY EXPORTING THE PROJECT指令进行修改。跳过/忽略步骤 #1A#1B。只需执行从 #2#5 的步骤。而已。

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


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

--

如果引用计数错误消失了,就停在这里:

5.遇到如下错误?

使用 Gradle 时必须对构建失败发布版本进行签名

只需 sign 来自 Build Settings 中的Publishing Settings 的 apk。您可以创建新的密钥库或使用现有的。


6.另一个类似下面的错误?

错误:避免硬编码调试模式;忽略它允许调试 并发布构建以自动分配一个 [HardcodedDebugMode]

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


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

【讨论】:

  • 我必须使用每个插件,当我尝试将项目导出为 Android 项目时遇到同样的错误,我应该在 Android 项目中导出后做任何更改吗?
  • 嗨,感谢您的回答,当我这样做时,当我安装 apk 文件时,通过触摸后退按钮,应用程序最小化并同时执行 keydown.escape。你知道为什么它会最小化我的游戏吗?
  • 感谢您的详细解答!几天前我投了赞成票:) 这真的很容易理解。但我现在有两个问题。 1.我可以像在Android Studio中一样在Unity的mainTemplate.gradle中放置除默认2.1.0以外的其他Gradle安装版本吗? 2. 如何更新 google-services 插件?我已经在 Unity 中正确设置了 sdk 文件夹,我在 Android Studio 中更新到了最新版本,但是在使用 mainTemplate.gradle 中的插件设置构建时出现版本冲突错误..
  • 1.我不知道,但试试看。请注意,Unity 确定它们支持的 gradle 版本。如果他们不支持其他人,它将无法工作,或者您将在构建项目时遇到问题。 2.如果遇到冲突,请查看unity-jar-resolver。任何进一步的冲突,创建一个新问题。我相信很多人都可以帮助你
  • 按照说明操作。它位于<UnityInstallationDirecory>\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\GradleTemplates。您必须在您的路径上用您的 Unity 安装路径替换 UnityInstallationDirecory。你必须谷歌,因为我没有使用 Mac。路径的其余部分应该在那里。在 Mac 上可能是 /Applications/Unity
【解决方案2】:

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

您正在使用大量插件,因此您面临Android limitation 无法引用超过 64k 的方法。

你可以尝试解决这个问题:

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

【讨论】:

  • 非常感谢!你说得对!如果我可以使用 Unity 的 Gradle,我可以做任何我想做的事!!哇,在 Unity 中直接应用 ProGuard,我从来没想过。你的回答给了我一些奇思妙想。但问题是,我不知道如何在 Unity 中使用 Gradle。有这方面的教程或指南吗?特别是我想知道如何直接引用 Android Studio 的依赖项,例如 appcompat 库和 Google Play 服务。这对我来说将是一个游戏规则改变者!
  • 从 Unity 2017.1 开始(我认为),您可以从 Player Settings 添加自定义 gradle 构建文件。在此文件中,在“依赖项”下,您可以添加任何您喜欢的依赖项(例如 appcompat 等)。我相信这应该可以正常工作。
  • 再次感谢您让我意识到 Unity Gradle 的潜力 :)
  • 如何在 Unity 中使用 ProGuard?设置程序是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多