修复Android内核构建报错not well-formed (invalid token)
问题根因
RELAX_USES_LIBRARY_CHECK := true对你这个报错完全无效,因为这个配置是用来跳过<uses-libraries>依赖匹配校验的,而你碰到的not well-formed (invalid token): line 1, column 2是XML格式解析阶段就直接崩溃,根本没走到依赖校验的逻辑。
报错本质是构建系统调用aapt读取jar包内的AndroidManifest.xml时,读不到合法的XML内容。一加6T(代号fajita)原厂搭载Android 9/10固件,你提取的这些高通专有jar普遍存在两个问题:
- 提取时没有做deodex处理,拿到的只是空壳jar,包内的
AndroidManifest.xml被裁剪、替换成了非标准二进制内容,甚至文件大小为0 - 老版本固件里jar包内嵌的二进制AXML格式和Android 12构建环境自带的aapt版本不兼容,文件头标记被识别为非法字符
你用JD-GUI反编译看到代码结构正常不代表文件没问题,JD-GUI只会解析class/dex文件,根本不会校验包内Manifest文件的格式合法性。
解决方法
按以下步骤操作即可修复:
- 先验证问题:任选一个报错的jar,用压缩软件打开,把根目录下的
AndroidManifest.xml拖出来,用十六进制编辑器查看,如果开头不是标准AXML魔数0x03 0x00,或者打开后全是乱码、文件大小为0,即可确认是上述问题。 - 采用最小Manifest替换方案修复,这是兼容性最高、对原有代码侵入最小的方案:
- 给每个报错的jar单独写一个最小可解析的AndroidManifest.xml,以
com.qti.dpmframework.jar为例,文件内容如下:
其余报错的jar只需要把<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.qti.dpmframework" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="31" android:targetSdkVersion="31"/> </manifest>package字段替换成对应jar的包名即可。 - 找到这些jar对应的
java_import模块声明,一般存放在vendor/oneplus/fajita/proprietary/Android.bp文件中,给每个出问题的模块添加manifest配置项,指向你刚编写的对应manifest文件,配置示例如下:java_import { name: "com.qti.dpmframework", jars: ["framework/com.qti.dpmframework.jar"], manifest: "framework/manifests/com.qti.dpmframework.xml", // 新增这行配置 sdk_version: "core_platform", // 其余原有配置保持不变即可 }
- 给每个报错的jar单独写一个最小可解析的AndroidManifest.xml,以
- 注意:只有当你修复完格式问题,后续构建如果出现uses-library依赖缺失类报错时,添加
RELAX_USES_LIBRARY_CHECK := true才会生效,当前阶段加这个配置完全不生效是因为构建流程还没走到依赖校验的步骤。 - 不要尝试用JD-GUI反编译后重打包、重新签名jar的方式修复,这类操作很容易破坏预编译jar的字节码对齐规则,反而会引出更多系统运行时异常。
内容的提问来源于stack exchange,提问作者zinger
相关产品推荐
相关产品推荐

