Unity Gradle出包遇到Could not compile build file.问题的解决办法

首先贴出工程的环境配置情况:
Unity:2017.3.1f1
Android SDK API Level: 25
JDK:1.8.0_172
Gradle: gradle-4.10.2

最近项目里需要接入许多SDK,在出包时使用Internal出包时由于接入的SDK内基础包太多了,出现了所谓“the 64k problem”。安卓代码中的方法数量如果超过Android Dex允许的最大65536个,就不能使用Internal出包了。

CommandInvokationFailure: Unable to convert classes into dex format.
C:/Program Files/Java/jdk1.8.0_131\bin\java.exe -Xmx2048M -Dcom.android.sdkmanager.toolsdir="C:/Users/Administrator/AppData/Local/Android/sdk\tools" -Dfile.encoding=UTF8 -jar "C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\sdktools.jar" -
 
stderr[
 
trouble writing output: Too many field references to fit in one dex file: 85656; max is 65536.
You may try using multi-dex. If multi-dex is enabled then the list of classes for the main dex list is too large.
References by package:
     3 android.accounts
    26 android.app
     1 android.bluetooth
     2 android.content
    37 android.content.pm
    10 android.content.res
     3 android.database
    44 android.graphics
     2 android.media
     1 android.media.browse
     2 android.net
     6 android.net.wifi
    31 android.

解决64k问题的办法有:
1.使用ProGuard工具,优化基础包内未被你使用到的方法。
2.采用多Dex分包机制(Multiex).
3.使用Gradle出包。

为了节省时间,我选用了使用Gradle的方式出包,可是最终依然遇到问题,Unity报错:

CommandInvokationFailure: Gradle build failed. 
C:/Program Files/Java/jdk1.8.0_172\bin\java.exe -classpath "C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle\lib\gradle-launcher-4.0.1.jar" org.gradle.launcher.GradleMain "-Dorg.gradle.jvmargs=-Xmx2048m" "assembleRelease"

stderr[

FAILURE: Build failed with an exception.

* Where:
Build file 'E:\WorkSpace\C3_Project\Client\Temp\gradleOut\build.gradle'

* What went wrong:
Could not compile build file 'E:\WorkSpace\C3_Project\Client\Temp\gradleOut\build.gradle'.
> startup failed:
  General error during class generation: 378
  
  java.lang.ArrayIndexOutOfBoundsException: 378
  	at org.codehaus.groovy.classgen.asm.CallSiteWriter.getCreateArraySignature(CallSiteWriter.java:58)
  	at org.codehaus.groovy.classgen.asm.CallSiteWriter.makeCallSite(CallSiteWriter.java:317)
  	...

结合网上的查询结果,发现是Gradle build时,Unity2018.2.1默认使用了自己提供的gradle模板(这个模板可以在unity的安装目录下找到:C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\GradleTemplates\mainTemplate.gradle),这个模板里面的aaptOptions noCompress内列举了在aaptOptions编译时不需要压缩的文件类型。

aaptOptions {
        noCompress '.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**
    }

根据:
https://blog.csdn.net/AnYuanLzh/article/details/80923820
https://answers.unity.com/questions/1480075/gradle-build-error-when-update-from-564p4-to-20173.html
这两个地方查到的资料,发现删除上述配置里的STREAMING_ASSETS即可出包成功。
但是删除后会造成什么样的影响还不太清楚,如果有知道的同学不吝赐教!

最后,避免删除Unity原始的mainTemplate.gradle文件,使用Unity buildSetting PublishSetting选项内的的Use Custon Gradle Template:
在这里插入图片描述
将Unity 安装目录下的.gradle文件拷贝到Plugins\Android下,并删除STREAMING_ASSETS即可。

你可能感兴趣的:(技术分享)