Unity导出Gradle工程或者apk包,StreamAssets目录文件超过255无法导出的问题 ... ... ...

本文解决Unity升级后打包Android项目时遇到的StreamAssets文件数量超标问题,通过自定义Gradle模板并修改aaptOptions,实现资源按后缀分类压缩,避免groovy类库的数组越界错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   最近升级了unity,直接跨版本更新到了2018,工程随之遇到了问题,StreamAssets文件超标的问题,遍寻各大国内外帖子博客也没有找到解决方法。好一阵折腾,特此记录分享下。先上错误码:

CommandInvokationFailure: Gradle build failed. 

C:/Program Files/Java/jdk1.8.0_171\bin\java.exe -classpath "D:\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 'F:\project\IlRuntime\ILRuntimeU3D-master\ILRuntimeDemo\Temp\gradleOut\build.gradle'

 

* What went wrong:

Could not compile build file 'F:\project\IlRuntime\ILRuntimeU3D-master\ILRuntimeDemo\Temp\gradleOut\build.gradle'.

> startup failed:

  General error during class generation: 1866

  

  java.lang.ArrayIndexOutOfBoundsException: 1866

   at org.codehaus.groovy.classgen.asm.CallSiteWriter.getCreateArraySignature(CallSiteWriter.java:58)

   at org.codehaus.groovy.classgen.asm.CallSiteWriter.makeCallSite(CallSiteWriter.java:317)

   at org.codehaus.groovy.classgen.asm.InvocationWriter.makeCachedCall(InvocationWriter.java:307)

   at org.codehaus.groovy.classgen.asm.InvocationWriter.makeCall(InvocationWriter.java:397)

   at org.codehaus.groovy.classgen.asm.InvocationWriter.makeCall(InvocationWriter.java:104)

   at org.codehaus.groovy.classgen.asm.InvocationWriter.makeInvokeMethodCall(InvocationWriter.java:88)

   at org.codehaus.groovy.classgen.asm.InvocationWriter.writeInvokeMethod(InvocationWriter.java:464)

   at org.codehaus.groovy.classgen.AsmClassGenerator.visitMethodCallExpression(AsmClassGenerator.java:771)

   at org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:66)

   at org.codehaus.groovy.classgen.asm.StatementWriter.writeReturn(StatementWriter.java:590)

   at org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.writeReturn(OptimizingStatementWriter.java:324)

   at org.codehaus.groovy.classgen.AsmClassGenerator.visitReturnStatement(AsmClassGenerator.java:620)

   at org.codehaus.groovy.ast.stmt.ReturnStatement.visit(ReturnStatement.java:49)

   at org.codehaus.groovy.classgen.asm.StatementWriter.writeBlockStatement(StatementWriter.java:85)

   at org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.writeBlockStatement(OptimizingStatementWriter.java:159)

   at org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:570)

   at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71)

   at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:104)

   at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:115)

 

很明显,问题就是越界了,标记了  java.lang.ArrayIndexOutOfBoundsException: 1866,这正是StreamAssets下资源数量。原因不明,找到了org.codehaus.groovy.classgen.asm.CallSiteWriter.getCreateArraySignature 直接翻看源码如下:

 

private static String [] sig = new String [255];
 private static String getCreateArraySignature(int numberOfArguments) {
 if (sig[numberOfArguments] == null) {
 StringBuilder sb = new StringBuilder("(");
 for (int i = 0; i != numberOfArguments; ++i) {
 sb.append("Ljava/lang/Object;");
 }
 sb.append(")[Ljava/lang/Object;");
 sig[numberOfArguments] = sb.toString();
 }
 return sig[numberOfArguments];
 }

 

 

      原来groovy已经把数组定义成了最大255。问题就是这样,修改groovy类库是不可能的了,那就是个深坑,还是不要动的好。那如何解决这个问题?

      传入getCreateArraySignature 函数的参数其实是build.gradle的属性【aapOptions】的数量,这里记录的值就是1866个啊,太多了,

我不需要把每个文件都记录一遍,我只需按后缀分类就可以了。

修改步骤如下:

1.使用自定义gradle template

在unity工程里依次: Build Setting-->Publishing Setting-->Build --Custom Gradle Template勾选上,

这时候会自动生成Plugins/Android下mainTemplate,打开这个文件,清爽了许多,少了一大串的文件名。

2.修改mainTemplate

 

    aaptOptions {

        noCompress '.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**

    }

添加我们自己的类型后缀,比如我的资源后缀名是 '.bundle'.

aaptOptions {

        noCompress '.unity3d', '.ress', '.resource', '.obb','.bundle'

    }

ok,再次打包,提示打包成功。

    好了,下班了,就写到这里,有说的不对的地方还请指正,敬谢。

### Unity 2022.3.45 导出 Android Gradle 工程教程 在 Unity 2022.3.45 中将项目导出为 Android Gradle 工程是一个常见的需求,尤其是在需要自定义构建流程或与原生代码集成的情况下。以下是关于此过程的详细说明: #### 配置 Unity 项目以支持 Gradle 构建 为了确保能够顺利导出并构建 Android 应用程序,需完成以下配置步骤。 1. **设置目标平台** 在 Unity 编辑器中切换至 Android 平台。通过菜单 `File -> Build Settings` 打开构建设置窗口,选择 `Android` 并点击 `Switch Platform`[^1]。 2. **启用自定义 Gradle 模板** 进入 `Edit -> Project Settings -> Player` 设置面板,在 `Other Settings` 下找到 `Build System` 参数,并将其更改为 `Gradle (Experimental)` 或者最新的稳定选项。这一步会激活 UnityGradle 支持功能[^2]。 3. **调整脚本后端** 对于使用 IL2CPP 脚本后端的情况,确认已安装对应的目标架构工具链(如 ARMv7 和 x86),因为缺失这些组件可能导致最终 APK 文件中缺乏必要的本地库文件 `libil2cpp.so`。 4. **创建和修改模板文件** 如果需要进一步定制化,则可以利用 Unity 提供的功能来自动生成初始版的 Gradle 脚本模板。具体操作如下: - 创建目录路径:Assets/Plugins/Android/templates/ - 将默认模版复制到这里作为基础进行编辑 5. **处理插件冲突问题** 当遇到类似于 “Plugin [id: 'com.android.application'] was not found” 错误时,通常是因为某些第三方插件指定了兼容版本号所致。解决方案之一就是统一管理依赖项声明方式以及锁定特定版本号来规避此类矛盾情况发生[^4]。 6. **执行实际导出动作** 完成上述准备工作之后就可以正式开始导出了。回到最初提到过的那个界面 (`File->Build Settings`) ,勾选场景列表中的条目再按住 Ctrl + Shift + B 组合键触发手动模式下的完整输出流程;或者单纯依靠常规按钮直接生成压缩形式的结果物亦可满足大部分场合下对于快速验证的需求。 ```bash # 示例命令用于检查环境变量是否正确设置了ANDROID_SDK_ROOT等必要参数 echo $ANDROID_SDK_ROOT && echo $JAVA_HOME ``` --- ### 注意事项 尽管按照以上指导应该能顺利完成整个迁移工作但仍可能存在个别特殊情况需要注意防范比如同操作系统之间细微差异所带来的影响等等都需要开发者自行摸索总结经验教训从而断提高效率减少重复劳动成本投入产出比达到最优状态为止!
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云雨巫山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值