【Android】解决 UTF-8 with BOM 引发的编译错误

477 阅读2分钟

问题

编译打包时遇到一个报错,如下:

FAILURE: Build completed with 2 failures.

1: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:shrinkArm64ReleaseRes'.
> A failure occurred while executing com.android.build.gradle.internal.transforms.ShrinkProtoResourcesAction
   > ParseError at [row,col]:[1,1]
     Message: Content is not allowed in prolog.

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
==============================================================================

2: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:shrinkArmeabiReleaseRes'.
> A failure occurred while executing com.android.build.gradle.internal.transforms.ShrinkProtoResourcesAction
   > ParseError at [row,col]:[1,1]
     Message: Content is not allowed in prolog.

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

看起来是某个文件的第一列第一行有错误,可是翻遍报错日志都没有找到指向哪个文件,即便在 gradle 编译命令添加编译参数 --stacktrace, --info 等等也没有打印出文件名。

尝试定位

于是开始用日志的关键词在搜索引擎搜索,搜到这篇文章Content is not allowed in prolog异常产生原因及处理方式,虽然不是 Android 项目的情况,但是给我了一个思路。 但是当我查看最近 git commit 并没有哪个xml文件被修改,我总不能手动从几千个文件中找吧。

于是我问 ChatGPT,如何遍历某文件夹的文件,并找出是否是 UTF-8 with BOM 编码

ChatGPT

以上代码并不会递归的扫描所有文件,于是我做了下修改:

import os

def check_utf8_bom(folder_path):
    """检查文件夹中所有文件是否是 utf-8 with bom 编码"""
    for file_name in os.listdir(folder_path):
        file_path = os.path.join(folder_path, file_name)
        if os.path.isfile(file_path):
            with open(file_path, 'rb') as f:
                if f.read(3) == b'\xef\xbb\xbf':
                    print(f"{file_name} 是 utf-8 with bom 编码")
        else:
            check_utf8_bom(file_path)

if __name__ == '__main__':
    check_utf8_bom([填入文件夹路径])

解决

在上述代码 check_utf8_bom 方法调用处填入要扫描的文件夹,然后将以上代码保存到 xxx.py 文件中,执行

python xxx.py

终于在 python 脚本的扫描下,定位出 UTF-8 with BOM 编码的文件,将该文件复制到文本编辑器中保存为 UTF-8 编码格式,编译通过了。

吐槽:翻了下出问题的文件好久没有更改了,可能是因为升级了 AGP 版本的原因。