前言

研究这个还是因为上一任(要不是今年年初烧尾插坠机了大抵是不会换的|・ω・`))主力机红米k50是红米+天玑,苦金凡调天玑久矣但又好像没dalao跑类原生,只好自己动手研究了(´•͈ुω•͈ू`)

参考资料:Lineage build guide Extracting proprietary blobs from zip files

准备

  • 搭载x86_64架构处理器,内存容量≥16GB16GB其实不太够,还得开32G的swap,建议上32GB或者64GB),硬盘容量≥500GB(存源码和编译产物用,最好是固态,越快越好)的Linux电脑/云服务器(建议用Ubuntu LTS
  • 要为其编译类原生系统的目标手机(虚空开包不可取啊骚年,总得测试一下不是
  • 合适的网络环境(需要拉取大几十G的源码
  • 设备的官方刷机包以及合适的解包工具

搭建编译环境

  • Ubuntu系统:打开终端,输入以下命令安装必要软件包:

     sudo apt update && sudo apt upgrade
     sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev
对于Ubuntu 23.10,使用以下命令安装来自23.04的libncurses5软件包:
 wget http://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.4-2_amd64.deb && sudo dpkg -i libtinfo5_6.4-2_amd64.deb && rm -f libtinfo5_6.4-2_amd64.deb
 wget http://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libncurses5_6.4-2_amd64.deb && sudo dpkg -i libncurses5_6.4-2_amd64.deb && rm -f libncurses5_6.4-2_amd64.deb
对于低于23.04版本的Ubuntu,还需要安装以下软件包:
lib32ncurses5-dev libncurses5 libncurses5-dev
  • 对于Arch Linux,使用以下命令即可:

    yay -S lineageos-devel
    sudo pacman -S libxcrypt-compat        #这是为了解决:error while loading shared libraries: libcrypto.so.1: cannot open shared object file: No such file or directory。

同步源码

  • 本文以编译LineageOS 21为例,其他类原生项目源码的同步方式大同小异,通常在项目的manifest仓库会有说明。
  • 在这一步请准备好合适的网络环境。

安装 repo 工具

repo工具用于拉取由一大堆仓库组成的庞大的AOSP源码仓。
使用以下命令安装repo并将其添加到PATH

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
source ~/.profile

配置 git

我们需要对git进行一些必要的配置,以便使用repo同步Android源码。
使用以下命令进行配置:

git config --global user.email "<你的邮箱>"
git config --global user.name "<你的名字>"

另外,有些仓库(比如webview)由于文件较大,被配置为使用lfs(Large File System)。为了顺利同步这些仓库,需要配置git-lfs
使用以下命令(Ubuntu):

sudo apt install git-lfs
git lfs install

开始同步

  1. 在准备存放源码的位置建立一个文件夹,例如~/android/lineage(后文lineage源码目录以此为例)
  2. 在这个文件夹下打开终端,使用以下命令初始化仓库:

    repo init -u https://github.com/LineageOS/android.git -b lineage-21.0 --git-lfs
  3. 使用以下命令开始同步:

    repo sync
可以参考清华TUNA源的说明更改配置文件从国内的清华源下载部分源码。
另外,如果出现了有仓库由于网络原因同步失败的情况(如图所示),请确保网络环境稳定之后重复repo sync过程,直到不出错为止。
同步过程耗时视网络条件和电脑性能而定,还请稍安勿躁坐和放宽,耐心等待。

出错了╰(‵□′)╯

准备设备相关文件

准备设备树

设备树(device tree)是一系列源码和配置文件,定义了对于一款特定型号的设备编译Android的方式。
对于LineageOS官方支持的设备,官方提供了自动下载相关设备树文件的功能。在源码根目录(例如~/android/lineage),使用以下命令:

source build/envsetup.sh
breakfast <设备代号>

如果你的设备未被官方支持,则需要自行寻找相关设备树、内核树及相关依赖(如果存在)文件,并放置于device/<设备品牌>/<设备代号>对应目录。

以Redmi K50(代号rubens)为例,设备树包含device_xiaomi_rubensdevice_xiaomi_mt6895_common,内核树为kernel_xiaomi_mt6895,需要将设备树文件夹放置于~/android/lineage/device/xiaomi/rubens~/android/lineage/device/xiaomi/mt6895-common,内核树放置于~/android/lineage/kernel/xiaomi/mt6895。此外还有device_mediatek_sepolicy_vndrhardware_mediatekhardware_xiaomi等依赖仓库,需要分别放置于~/android/lineage/device/mediatek/sepolicy_vndr~/android/lineage/hardware/mediatek~/android/lineage/hardware/xiaomi

提取专有 blob

专有 blob是一些特定的驱动或配置文件,它们并不能从源码编译,需要从原厂刷机包或系统中提取,放置在vendor/<设备品牌>/<设备代号>下。以下是获取专有blob的几种方式:

  • 方法一:从官方刷机包中提取
    使用合适的工具解包官方刷机包到合适的位置(此处假定解包后文件位于~/android/dump
    system.img解包到~/android/dump/system
    vendor.img解包到~/android/dump/system/vendor
    product.img解包到~/android/dump/system/product
    system_ext.img解包到~/android/dump/system/system_ext
    odm.img解包到~/android/dump/system/odm
    vendor_dlkm.img(如果存在的话)解包到~/android/dump/system/vendor_dlkm
    接下来在设备树目录(~android/lineage/device/<设备品牌>/<设备代号>)下打开终端,使用以下指令:

    ./extract-files.sh ~/android/dump/system
  • 方法二:通过adb直接从设备提取
注:这个方法通常要求设备已经在运行 LineageOS,并且启用adb调试和root权限。在官方系统下容易出现由于多种原因提取文件不完全的情况,因此通常推荐使用方法一。

在设备树目录(~android/lineage/device/<设备品牌>/<设备代号>)下打开终端,使用以下指令:

./extract-files.sh
  • 方法三:直接使用配套的vendor tree

有些时候device tree的制作者会同时将TA使用的vendor tree一并上传。这时候只需要下载对应文件,将其放置于vendor/<设备品牌>/<设备代号>下即可。

开始编译!

接下来回到源码根目录(~/android/lineage),打开终端,输入以下命令:

source build/envsetup.sh
brunch <设备代号>

编译流程会自动启动,接下来只需要坐和放宽等出包即可ヽ(*・ω・)ノ

编译有些版本时可能需要指定版本分支和构建类型。例如为Redmi K50编译基于Android 14 QPR3LineageOS 21,构建类型为eng时,需要使用brunch lineage_rubens-ap2a-eng
如果报错了请不要着急,可以根据FAILED后面提示的内容(类似图上这样),运用包括但不限于搜索引擎、GitHub、问GPT、摇dalao等方式尝试修复~
还来?半路报错

刷包测试

好耶,成功了ヽ(✿゚▽゚)ノ
看到类似图中的Build completed successfully提示时,恭喜你成功编译了一份类原生刷机包!
接下来请进入out/target/product/<设备代号>目录,这里存放着最终生成的刷机包文件(形如lineage-21.0-20240716-UNOFFICIAL-rubens.zip)。用合适的方法(包括但不限于直接用twrp安装、adb sideload、解包出img后用fastboot刷入对应分区等)刷进手机,Enjoy!ヽ(・∀・)ノ

那么…接下来应该做什么?

以下内容直接复制自LineageOS官方文档
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.
恭喜!欢迎来到自助者精英俱乐部。您已经从零开始构建了您的操作系统。你是你的领域的主人,希望你在学习的过程中学到了一些东西,也得到了一些乐趣。