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

时间:2017-03-03 15:33:50

标签: android unity3d multidex

我的项目使用这些插件:

  • OneSignal
  • GooglePlayServices
  • 调整
  • Google Analytics
  • Unity IAP
  • Facebook SDK

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

但是我超过了现场引用次数

这是我的.aar文件列表 List

我应该怎样做才能减少引用次数?

2 个答案:

答案 0 :(得分:30)

  

那么我应该怎样做才能减少参考次数?

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

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

唯一实现这一目标并为Android构建的方法是 export Project as Android Project然后使用Android Studio构建 。这将删除Unity编辑器强加的参考限制。

修改

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

通过出口项目修复

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

enter image description here

1B 。导入Android Studio:

enter image description here

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

  

错误:org.gradle.api.internal.tasks.DefaultTaskInputs $ TaskInputUnionFileCollection   无法施展   org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection

enter image description here

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

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

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

enter image description here

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

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

enter image description here

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

enter image description here

4 。将multiDexEnabled true添加到 build.gradle “defaultConfig”块>文件。

enter image description here

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

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

  

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

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

dexOptions {
    javaMaxHeapSize "4g"
}

enter image description here

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

必须拥有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并查看其是否有效:

enter image description here

-

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

5 。获得如下错误的错误?

  

使用Gradle

时必须签署构建失败版本构建

构建设置中的发布设置中的sign版本。您可以创建新密钥库或使用现有密钥库。

enter image description here

6 。另有错误,如下所示?

  

错误:避免硬编码调试模式;离开它允许调试   并释放构建以自动分配一个[HardcodedDebugMode]

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

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

答案 1 :(得分:5)

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

您使用了大量插件,因此您遇到Android limitation无法引用64k以上的方法。

您可以尝试解决此问题:

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