首页 文章

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

提问于
浏览
10

我的项目使用这些插件:

  • OneSignal

  • GooglePlayServices

  • 调整

  • Google Analytics

  • Unity IAP

  • Facebook SDK

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

但我超过现场参考计数

这是我的.aar文件列表
List

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

2 回答

  • 29

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

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

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

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


    EDIT

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

    通过出口项目修复

    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文件中的"dependencies"块 .

    enter image description here


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

    enter image description here

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


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

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

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

    dexOptions {
        javaMaxHeapSize "4g"
    }
    

    enter image description here

    FIX没有导出项目

    必须具有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应该是什么样子 . 这仅供参考 . 我建议 you don't use mine 但是按照上面的复制步骤来创建你的,因为未来的Unity版本可以带有不同的文件 . 您想确保使用最新版本,否则可能会遇到问题 .


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

    enter image description here

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

    5 . 获取如下错误的错误?

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

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

    enter image description here


    6 . 下面有另一个错误?

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

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


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

  • 5

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

    您正在使用大量插件,因此您遇到了无法引用64k以上方法的问题 .

    您可以尝试解决此问题:

    • 如果可能,删除其中一些插件(如已接受的答案中所述) .

    • 使用multidex . 在过去,只有通过将项目导出到Android工作室并在那里构建它才能实现 . 从Unity 5.5开始,您可以使用Unity从Gradle构建项目 . 这意味着您可以创建自定义gradle文件,将游戏配置为使用Multidex . 这不会减少方法引用计数,但它可以通过将本机Java计数分成多个dex文件来解决它 .

    • 使用ProGuard - 因为您可以使用Unity中的Gradle,您还可以定义ProGuard以运行和删除任何未使用的代码 .

相关问题