aapt2 Unknown chunk type 200

目标 & 背景

最近的项目需要接其他海外渠道的 SDK,在处理 Android 构建时,在 M 系列的 Mac 下构建时就会有如下错误

* What went wrong:
Execution failed for task ':launcher:processDebugResources'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > AAPT2 aapt2-4.0.1-6197926-osx Daemon #0: Unexpected error during link, attempting to stop daemon.
     This should not happen under normal circumstances, please file an issue if it does.

在 Task 细节中可以看到 aapt2 抛出了一个 200 错误

> Task :launcher:processDebugResources FAILED
aapt2 W 04-28 14:04:21 79304 5722340 LoadedArsc.cpp:657] Unknown chunk type '200'.

这个问题在 Intel 系列的 Mac 上不会存在,比较蛋疼

解决方案

在搜了一部分资料后,基本锁定问题在 gradle 版本上,当前项目使用的 Unity 版本为 2021,但是实测 2022 问题仍然存在。在 Unity 文档中 Gradle for Android 中提到了这几个大版本使用的 gradle 版本信息

Unity 版本Gradle 版本Gradle Plugin-in 版本
6000.08.48.3.0
2022.37.27.1.2
2021.36.1.14.0.1

Android Stuidio 中提供了 AGP Upgrade Assistant 工具,挨个测试版本后,发现需要将 gradle Plugin-in 升级到 7.4.2, gradle 升级到 7.5

image

AGP 中可以看到详细信息

image

仔细观察两个版本的文件变化, AGP 会修改根目录的 build.gralde 文件中 gralde plugin-in 的版本号,以及 gradle 文件夹下的 gradle-wrapper.properties 文件中的版本号

image

image

因此第一步需要在 Unity 中修改 baseProjectTemplate.gradle 文件,版本调整为 7.4.2

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

第二部需要借助 git 上的一个工具 unity-gradle-wrapper 修改 gradle 的版本为 7.5,官方地通了一个 ScriptObject 配置文件,一般我会将这个工具集成到我们的打包流程中,核心就是下方代码的版本获取

public class GradleWrapperGenerator : IPostGenerateGradleAndroidProject
{
    public int callbackOrder => 0;

    public void OnPostGenerateGradleAndroidProject(string path)
    {
		// xxx
        string gradleVersion = "7.5"; // 这里修改为 7.5
        if (string.IsNullOrWhiteSpace(gradleVersion))
        {
            return;
        }
        // xxx
    }
    // xxx
}

当使用这种方式修改项目后,如果关闭了 Export Project 再点击 Build/Build And Run 这个部分的代码并不会触发

image

生成的目录结构如下,会多出 gradlewgradlew.bat 文件

.
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── launcher
├── local.properties
├── settings.gradle
└── unityLibrary

此时出包就需要运行如下指令

# Release 包
./gradlew assembleRelease
# Debug 包
./gradlew assembleDebug

# Windows Release
call gradlew.bat assmbleRelease
# Windows Debug
call gradlew.bat assmbleDebug

而生成的 apk 文件会出现在如下路径

./launcher/build/outputs/apk/release/launcher-release.apk
./launcher/build/outputs/apk/debug/launcher-debug.apk

最后只需要修改一下打包流程,生成 Android Project 后,执行对应的 gradlew 命令即可

最后

为了搞定这个问题,试了好多个 Unity 的版本,但是 Unity Hub 在使用一段时间后,安装新的 Unity 时,Android 环境总是会出现 Install Failed,而且这个问题已经存在了很久了,居然一直没有修复

最有效的方式竟然是卸载 Unity Hub 重装...