Pixel 6a 的 Android 16 内核源码无法同步,该如何排查?
结论
日志显示,同步在 platform/build/bazel_common_rules 仓库失败,远端没有提供本次 fetch 请求的 refs/heads/android-gs-bluejay-6.1-android16。这不能证明所有仓库都缺少该分支,也不能据此认定初始化命令写错了。
官方 Pixel 内核构建说明将 android-gs-bluejay-6.1-android16 列为 Pixel 6a(bluejay)的生产内核 manifest 分支,选择该分支有官方依据。不要为了绕过同步错误,就把 android-gs-bluejay-6.1-android15-qpr2-beta 当作 Android 16 的兼容替代品。官方 Pixel 内核构建说明
为什么初始化成功,同步仍然失败?
repo init 成功说明 manifest 仓库可以初始化。repo sync 还需要下载 manifest 引用的各个项目。
核对到的官方 default.xml 设置了默认 revision:
<default revision="android-gs-bluejay-6.1-android16" remote="aosp" sync-j="4"/>
platform/build/bazel_common_rules 没有单独指定 revision,因此会继承这个默认分支,与日志中请求的远端引用一致。官方 manifest
如果该项目没有发布对应引用,就无法按这份 manifest 完成整套源码的同步。日志中还使用了 --fail-fast,遇到这一处失败后同步便停止了,因此无法判断其余项目的状态。
如何确认问题出在哪里?
1. 分别检查 manifest 和失败项目的远端分支
在能够访问 Android Git 仓库的环境中执行:
git ls-remote --exit-code --heads \
https://android.googlesource.com/kernel/manifest \
refs/heads/android-gs-bluejay-6.1-android16
git ls-remote --exit-code --heads \
https://android.googlesource.com/platform/build/bazel_common_rules \
refs/heads/android-gs-bluejay-6.1-android16
根据结果判断:
- 输出提交哈希和分支名:该仓库当前提供这个引用。
- 没有匹配输出,退出码为
2:远端查询成功,但没有找到匹配引用。 - 出现连接、证书或权限错误:先处理访问问题,不能将其解释为分支不存在。
命令检查的是执行时的远端状态。现有日志只能说明当时的 fetch 失败,不能保证远端现在仍然缺少该引用。
2. 检查本地实际使用的 manifest
在源码目录执行:
repo manifest
核对默认 revision 和 platform/build/bazel_common_rules 项目的配置。如果使用过 .repo/local_manifests/,还应检查其中是否覆盖了该项目的 revision 或 remote。
如果官方 manifest 要求这个分支,而对应的官方仓库确实没有提供它,就有依据将问题定位为远端 manifest 与项目引用不一致。仅凭现有日志,仍无法确认是发布遗漏、分支调整还是其他原因。
3. 单独重试失败项目
确认远端引用存在后,可以先单独同步该项目:
repo sync -c --no-tags -j1 --fail-fast build/bazel_common_rules
这里使用的是 manifest 中的本地路径 build/bazel_common_rules。成功后再执行完整同步:
repo sync -c --no-tags -j$(nproc) --fail-fast
--depth=1 限制历史深度,--no-tags 不下载标签,-j 控制并发。这些选项都不能让远端产生不存在的分支;取消 -c 也不会自动选出兼容的替代 revision。
如果确认官方配置与远端引用不一致,可以提交问题报告,附上 manifest 提交号、失败项目和 git ls-remote 结果。不要因为另一个分支能够下载,就随意覆盖构建依赖的 revision。
是否应该改用 Android 15 QPR2 Beta 分支?
现有信息不足以支持这个替换。Android 版本名称和 6.1 内核版本号,不能单独证明两套设备内核源码、驱动和系统构建可以互换。
应先确认设备当前的系统构建和内核信息:
adb shell getprop ro.build.fingerprint
adb shell getprop ro.build.id
adb shell uname -r
adb shell cat /proc/version
这些信息有助于匹配源码,但未必足以唯一确定整套 manifest 的提交。只有在官方说明或对应源码记录明确支持目标系统构建时,才有依据使用另一条分支。Android 14 分支能够同步,也不能证明它适用于当前 Android 16 系统。
官方文档还说明,Pixel 6a 内核仓库中的预置 vendor ramdisk 可能与设备系统不匹配,导致启动时的 SELinux 失败。因此,同步成功、编译成功和设备能够启动,需要分别判断。官方 vendor ramdisk 说明
同步完成后如何构建?
源码完整同步且确认分支与目标系统匹配后,可按该分支的构建说明使用设备脚本。如果需要从本地源码编译核心内核,官方生产分支的构建说明提供了 BUILD_AOSP_KERNEL=1:
BUILD_AOSP_KERNEL=1 ./build_bluejay.sh
生产分支的设备脚本默认可能使用预编译 GKI 内核;上述变量用于要求编译本地核心内核源码。执行前仍应核对当前分支脚本的要求。官方编译说明
备注:内容仅供参考。
