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.0 8.4 8.3.0
2022.3 7.2 7.1.2
2021.3 6.1.1 4.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 重装…