我的项目使用这些插件:
OneSignal
GooglePlayServices
调整
Google Analytics
Unity IAP
Facebook SDK
几乎每个项目都使用这些插件 .
但我超过现场参考计数
这是我的.aar文件列表
我该怎么做才能减少参考数量?
那么我该怎么做才能减少引用次数?
你有很多插件,有很多功能/字段 . 从Unity的编辑器中构建它时有一个限制,你已经达到了这个限制 .
要减少引用计数,您必须删除一些这些插件,但我确定您需要它们,并且在这种情况下删除可能不是合适的解决方案 .
实时解决此问题并为Android构建的方法是export项目作为Android项目,然后使用Android Studio构建它 . 这将删除Unity编辑器强加的参考限制 .
EDIT
我忘了提到你必须在导出后启用multidex . 由于很多人每天都会遇到这个问题,所以我决定通过 exporting it out 添加一个关于如何解决这个问题的详尽说明,以及如何修复它 without exporting it .
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文件中的应用程序标记 .
android:name="android.support.multidex.MultiDexApplication" >
3 . 将 compile 'com.android.support:multidex:1.0.1' 添加到build.gradle文件中的"dependencies"块 .
compile 'com.android.support:multidex:1.0.1'
4 . 将 multiDexEnabled true 添加到"defaultConfig"块中,该块位于build.gradle文件的"android"块中 .
multiDexEnabled true
构建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 文件夹 .
<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
<UnityInstallationDirecory>\Editor\Data\PlaybackEngines\AndroidPlayer\Apk
AndroidManifest.xml
3 . 打开刚刚使用Visual Studio复制的 mainTemplate.gradle 和 AndroidManifest.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并查看它是否有效:
如果引用计数错误消失,请在此处停止:
5 . 获取如下错误的错误?
使用Gradle时,必须签署构建失败版本构建
只需sign来自Build Settings中发布设置的apk . 您可以创建新密钥库或使用现有密钥库 .
6 . 下面有另一个错误?
错误:避免硬编码调试模式;将其删除允许调试和发布版本自动分配一个[HardcodedDebugMode]
从 AndroidManifest.xml 文件中删除 android:debuggable="true"> .
android:debuggable="true">
如果此非导出解决方案不适合您,则必须使用导出解决方案 .
IMO,接受的答案不正确(或仅部分正确) . 导出Android工作室不会“神奇地”解决这个问题问题 . 此外,根据我的经验,导出的Android工作室项目并不总是立即构建,您必须先修复很多东西才能实际构建它 .
您正在使用大量插件,因此您遇到了无法引用64k以上方法的问题 .
您可以尝试解决此问题:
如果可能,删除其中一些插件(如已接受的答案中所述) .
使用multidex . 在过去,只有通过将项目导出到Android工作室并在那里构建它才能实现 . 从Unity 5.5开始,您可以使用Unity从Gradle构建项目 . 这意味着您可以创建自定义gradle文件,将游戏配置为使用Multidex . 这不会减少方法引用计数,但它可以通过将本机Java计数分成多个dex文件来解决它 .
使用ProGuard - 因为您可以使用Unity中的Gradle,您还可以定义ProGuard以运行和删除任何未使用的代码 .
2 回答
你有很多插件,有很多功能/字段 . 从Unity的编辑器中构建它时有一个限制,你已经达到了这个限制 .
要减少引用计数,您必须删除一些这些插件,但我确定您需要它们,并且在这种情况下删除可能不是合适的解决方案 .
实时解决此问题并为Android构建的方法是export项目作为Android项目,然后使用Android Studio构建它 . 这将删除Unity编辑器强加的参考限制 .
EDIT
我忘了提到你必须在导出后启用multidex . 由于很多人每天都会遇到这个问题,所以我决定通过 exporting it out 添加一个关于如何解决这个问题的详尽说明,以及如何修复它 without exporting it .
通过出口项目修复
1A . 将Unity项目导出为Android项目 .
1B . 导入Android Studio:
如果您在导入Android Studio时出现等级错误,如下所示:
在build.gradle文件的"buildscript"块中的"dependencies"块中,更改:
至
如果导出项目并仍然得到相同的错误,则需要手动启用multidex . 以下是Google的doc中的简化步骤,该错误将在错误中显示给您:
2 . 将
android:name="android.support.multidex.MultiDexApplication" >
添加到AndroidManifest.xml文件中的应用程序标记 .3 . 将
compile 'com.android.support:multidex:1.0.1'
添加到build.gradle文件中的"dependencies"块 .4 . 将
multiDexEnabled true
添加到"defaultConfig"块中,该块位于build.gradle文件的"android"块中 .构建APK,看看它是否有效 . 如果引用计数错误消失,请在此处停止 .
5 . 获取如下所示的GC开销异常?
增加执行dex操作时将使用的堆大小 . 从solution,将以下内容添加到build.gradle文件中的"android"块:
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.gradle
和AndroidManifest.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并查看它是否有效:
如果引用计数错误消失,请在此处停止:
5 . 获取如下错误的错误?
只需sign来自Build Settings中发布设置的apk . 您可以创建新密钥库或使用现有密钥库 .
6 . 下面有另一个错误?
从
AndroidManifest.xml
文件中删除android:debuggable="true">
.如果此非导出解决方案不适合您,则必须使用导出解决方案 .
IMO,接受的答案不正确(或仅部分正确) . 导出Android工作室不会“神奇地”解决这个问题问题 . 此外,根据我的经验,导出的Android工作室项目并不总是立即构建,您必须先修复很多东西才能实际构建它 .
您正在使用大量插件,因此您遇到了无法引用64k以上方法的问题 .
您可以尝试解决此问题:
如果可能,删除其中一些插件(如已接受的答案中所述) .
使用multidex . 在过去,只有通过将项目导出到Android工作室并在那里构建它才能实现 . 从Unity 5.5开始,您可以使用Unity从Gradle构建项目 . 这意味着您可以创建自定义gradle文件,将游戏配置为使用Multidex . 这不会减少方法引用计数,但它可以通过将本机Java计数分成多个dex文件来解决它 .
使用ProGuard - 因为您可以使用Unity中的Gradle,您还可以定义ProGuard以运行和删除任何未使用的代码 .