背景是我在 xda 上发现了一个很不错的小米平板 4 的 ROM:[ROM][12.1][clover] LineageOS 19 for Xiaomi Mi Pad 4 [UNOFFICIAL] (opens new window),刷入一把发现内核没有集成 WireGuard,从 defconfig: clover: Disable WireGuard support (opens new window) 看到似乎是作者主动禁用了 WireGuard 相关内容。咱也不知道为啥(不懂 Android 开发,更不懂系统相关的开发了),索性我把这一行的 Commit revert 掉,编译个新的好了。

本文记录了相关的踩坑过程(这是构建完成后的回顾记录,不能保证一定通过,但能减少一些坑了)。

如果你也需要内核支持 WireGuard 的版本,可以直接从 https://sourceforge.net/projects/xiaomipad4-clover-lineageos/files/lineageos-19.1/ (opens new window) 下载,我已经上传好了。


# 环境准备

关于如何构建的文档其实随便在 LineageOS 上找个设备都有,比如 k30s 的 https://wiki.lineageos.org/devices/apollon/build(务必结合这个官方文档阅读,这里是补充说明)。

首先安装 adb 等工具,详细参见:https://wiki.archlinux.org/title/Android:

yay -S android-sdk-platform-tools

文档给出的是 Ubuntu 下需要安装的依赖,这里已经有人在 AUR 上配置好了:

yay -S lineageos-devel
sudo pacman -S libxcrypt-compat

libxcrypt-compat 是为了解决:error while loading shared libraries: libcrypto.so.1: cannot open shared object file: No such file or directory

可能还需要开启 32 位支持,参见:Arch Linux 安装使用教程 - 6.开启 32 位支持库 (opens new window)

# 源码准备

参照官方 Wiki 一路走到 Download the source code 之前,执行 repo sync 有几个注意事项:

  • 一共会从 GitHub 和 Google 下载约 150-200G 的源码,小心代理流量崩了
  • 最终完成包签名后,所有合计 250G,ccache 需要 50G,/tmp 可能需要 10G,建议预留出 300G 的空间
  • sync 命令可能要执行很久很久,需要耐心等待

# 构建

建议先找个官方支持的设备成功构建一次,因为我不确定下面的步骤是否会少些什么。

将如下内容放到文件 ~/android/lineage/.repo/local_manifests/roomservice.xml 中:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>

  <project name="LineageOS/android_hardware_xiaomi" path="hardware/xiaomi" remote="github" />

  <project name="DianQK/android_kernel_xiaomi_sdm660" path="kernel/xiaomi/sdm660" remote="github" />
  <project name="DianQK/android_device_xiaomi_sdm660-common" path="device/xiaomi/sdm660-common" remote="github" />
  <project name="kyasu/android_device_xiaomi_clover" path="device/xiaomi/clover" remote="github" />
  <project name="kyasu/android_vendor_xiaomi_sdm660-common" path="vendor/xiaomi/sdm660-common" remote="github" />
  <project name="kyasu/android_vendor_xiaomi_clover" path="vendor/xiaomi/clover" remote="github" />

</manifest>

再执行一次 repo sync

接下来走到 Prepare the device-specific code 环节,执行:

source build/envsetup.sh
breakfast clover

完成后跳到 Start the build

croot
brunch clover

如果一切顺利就能得到一个未签名的包。

签名过程参照 Signing Builds (opens new window) 即可,我已经修复了相关的报错。

如果在签名过程遇到 /tmp 磁盘不足,参见:Not enough space on /tmp (opens new window)

这真是个大工程,希望后面有机会也能参与相关的开发(那应该要很远了吧)。

多亏了以下几个工程我才能解决 WireGuard 构建问题:

最后感觉签名后的版本好像比未签名的要卡一些的样子,可能是我的错觉吧,希望未来能有更合适的设备(660 确实感觉有点顶不住了),由于我不打游戏,能来一个 8 英寸,配置是 778G + 12G + 256G + LTE/5G,高素质 DC 调光的 LCD 屏幕就好了。