许久没有关注自定义ROM相关的东西了,这些天又来了兴致。重新简单了解了下,新版本的 DerpFest 似乎已经是基于 LineageOS 了,那么对于 LineageOS 支持的设备,用 LineageOS 提供的设备树,应该能比较轻松地完成编译。
——事实上也确是如此,笔者为手里的 renoir 设备成功构建了 DerpFest 15.2,特将这一过程记录下。如果你恰好有相同设备,也可以跟着操作一番,体验一下 ROM 的构建流程。
如果打算自行构建...
自行构建对系统配置有一定要求:系统内存 > 32 GB,可能仍需更多 Swap 虚拟内存;
剩余硬盘(SSD)容量 > 500 GB,且如果使用机械硬盘将导致构建极慢。
本文中可能存在错误与不完善之处,恳请读者批评指正。
关于编译...
关于编译所需的依赖和详细教程,可以参考对应设备的 LineageOS Wiki。对于本文中的设备,即: Build for renoir | LineageOS Wiki
笔者的编译环境为 Ubuntu 24.04 (WSL)。受篇幅所限,下文将不再提及配置依赖的过程。
一、拉取 ROM 源代码
编译开始前需要获取 ROM 的源代码,需要用到 repo
工具(由 Google 开发,简化了对多个 Git 版本库的管理)。
首先进行初始化:
mkdir ~/derp && cd ~/derp
repo init -u https://github.com/DerpFest-AOSP/manifest.git -b 15.2 --git-lfs
为了节省磁盘空间,也可再添加参数 --depth=1
设置减少克隆深度。
一直卡住?
repo 初始化过程中会先尝试连接 Google 的服务器进行更新,国内用户可能无法访问。可以改用 清华大学开源软件镜像站 解决。export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
此外如有需要,进行下一步同步之前,还可以修改 .repo/manifests/default.xml
,将
<remote name="aosp"
fetch="https://android.googlesource.com"
改为
<remote name="aosp"
fetch="https://mirrors.tuna.tsinghua.edu.cn/git/AOSP"
接下来,同步源代码:
repo sync -j8
耐心等待这一步完成。
二、获取设备所需源代码
1. 直接下载部分
除了 ROM 源代码,还需要特定设备所需的配置、内核部分的源代码。可以手动克隆所需仓库,也可以像下面这样操作。
先初始化构建环境:
. build/envsetup.sh
再执行:
# $device 此处即 renoir,$release 此处即 bp1a。
lunch lineage_$device-$release-user
运行出错?
出错是正常的,但如果错误信息里有关于“DERPFEST_BUILD_TYPE
”的内容,可能需修改 vendor/lineage/config/version.mk
,将 6 - 10 行直接修改为 DERPFEST_BUILD_TYPE := Community
。
注意 lunch 命令格式
以前 lunch 命令没有 $release 这一部分,如果仍直接执行lunch lineage_renoir-user
是不正确的。
构建系统会自动从 LineageOS 的仓库获取所需源代码,在本例中就包括:
device/xiaomi/renoir
device/xiaomi/sm8350-common
kernel/xiaomi/sm8350
hardware/xiaomi
但是并不包含一些专有文件(vendor/xiaomi/renoir
vendor/xiaomi/sm8350-common
),它们需要单独提取(在下一步中说明)。没有它们,编译无法进行,这也是这一步骤报错的原因。
2. 提取部分
请参阅 Wiki 并谨慎操作
对于 DerpFest 官方支持的设备,可能不需要手动提取 vendor。此外,不同设备的提取方式可能不同,请参考 LineageOS Wiki:Extracting proprietary blobs from LineageOS zip files 。本文所述对应着 Wiki 中的 Payload-based OTA。
我们下载好 LineageOS 构建好的 ROM ,用 payload_dumper
等工具提取出所有分区的 img 镜像。假设把它们全部保存在 ~/system_dump
,接下来进行提取:
cd device/xiaomi/renoir
./extract-files.py ~/system_dump/
cd ../../..
此时 vendor/xiaomi/renoir
和 vendor/xiaomi/sm8350-common
就应该提取出来了。
三、修改源代码
1. 为内核添加 KernelSU Next
根据 KernelSU Next 的文档:
cd kernel/xiaomi/sm8350
curl -LSs "https://raw.githubusercontent.com/KernelSU-Next/KernelSU-Next/next/kernel/setup.sh" | bash -
然后,参考 向后移植 path_umount 修改 fs/namespace.c
即可。
2. 其他修改
根据实际需要进行修改。比如,为内核启用 Docker 所需的配置...... 在此就不再赘述。
在本例中笔者遇到过下面的问题:
[ 98% 67/68] finishing legacy Make module parsing ...
FAILED:
build/make/core/main.mk:1117: warning: device/xiaomi/renoir/lineage_renoir.mk includes non-existent modules in PRODUCT_PACKAGES
Offending entries:
android.hardware.thermal-service.qti
build/make/core/main.mk:1117: error: Build failed.
16:29:09 ckati failed with: exit status 1
临时解决方法是,找到 device/xiaomi/sm8350-common/common.mk
中的这一部分:
# Soong namespaces
PRODUCT_SOONG_NAMESPACES += \
$(LOCAL_PATH) \
hardware/xiaomi
向其中添加 hardware/qcom-caf/thermal-legacy-um
即可。
更新前内容
临时解决方法是:
git clone -b lineage-22.2-legacy-um https://github.com/LineageOS/android_hardware_qcom_thermal hardware/qcom/thermal
并找到 device/xiaomi/sm8350-common/common.mk
中的这一部分:
# Soong namespaces
PRODUCT_SOONG_NAMESPACES += \
$(LOCAL_PATH) \
hardware/xiaomi
向其中添加 hardware/qcom/thermal
即可。
四、配置签名
这一部分可以省略,但不建议,因为未签名的 ROM 无法通过 Play Integrity 认证。
# subject 内信息可自行修改
subject='/C=US/ST=State/L=City/O=Android/OU=Android/CN=Android/emailAddress=email@example.com';
for x in releasekey nfc platform shared media networkstack verity otakey testkey sdk_sandbox bluetooth;
do ./development/tools/make_key vendor/lineage/signing/keys/$x "$subject";
done
执行上述命令后,一路回车即可。
不要重复执行
构建完 ROM 并刷入设备后,如果后续重新构建并需要保留数据更新(dirty-flash),需要确保签名相同。请不要重复执行上面的代码,否则会使用新生成的密钥签名!
五、开始构建
前面做了那么多准备工作,是时候开始构建了。首先重新执行上面第二部分的 lunch 命令:
lunch lineage_renoir-bp1a-user
不出意外的话,构建系统将打印一些基础信息,确认无误后开始构建:
mka derp -j12
出现 OOM 错误?
尝试降低并行线程数(-j 后面的数字),并增加 Swap 容量。经过数小时的等待,就可以看到构建后的成果了(中途查错调试,实际用时约 3 小时):
六、后续工作

将自己编译的 ROM 刷到设备上体验一下吧!也许没有问题,也许还存在一些瑕疵......
引用一下 LineageOS Wiki 中的结语:
Success! So… what’s next?
You’ve done it! Welcome to the elite club of self-builders. You’ve built your operating system from scratch, from the ground up. You are the master/mistress of your domain… and hopefully you’ve learned a bit on the way and had some fun too.
PS:为什么选择构建 DerpFest?因为笔者曾经使用过 DerpFest,喜欢它的一些自定义功能,并向其提交过一些翻译,对其比较熟悉。
本文(https://www.cgtsoft.com/archives/80/)来源于 CGT Software,使用 CC BY-NC-SA 4.0 许可发布。