前言
研究这个还是因为上一任(要不是今年年初烧尾插坠机了大抵是不会换的|・ω・`))主力机红米k50是红米+天玑,苦金凡调天玑久矣但又好像没dalao跑类原生,只好自己动手研究了(´•͈ुω•͈ू`)
参考资料:Lineage build guide Extracting proprietary blobs from zip files
准备
- 搭载x86_64架构处理器,内存容量≥16GB(16GB其实不太够,还得开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
开始同步
- 在准备存放源码的位置建立一个文件夹,例如
~/android/lineage
(后文lineage源码目录以此为例) 在这个文件夹下打开终端,使用以下命令初始化仓库:
repo init -u https://github.com/LineageOS/android.git -b lineage-21.0 --git-lfs
使用以下命令开始同步:
repo sync
可以参考清华TUNA源的说明更改配置文件从国内的清华源下载部分源码。
另外,如果出现了有仓库由于网络原因同步失败的情况(如图所示),请确保网络环境稳定之后重复repo sync
过程,直到不出错为止。
同步过程耗时视网络条件和电脑性能而定,还请稍安勿躁坐和放宽,耐心等待。
准备设备相关文件
准备设备树
设备树(device tree)是一系列源码和配置文件,定义了对于一款特定型号的设备编译Android的方式。
对于LineageOS官方支持的设备,官方提供了自动下载相关设备树文件的功能。在源码根目录(例如~/android/lineage
),使用以下命令:
source build/envsetup.sh
breakfast <设备代号>
如果你的设备未被官方支持,则需要自行寻找相关设备树、内核树及相关依赖(如果存在)文件,并放置于device/<设备品牌>/<设备代号>
对应目录。
以Redmi K50(代号rubens)为例,设备树包含device_xiaomi_rubens
、device_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_vndr
、hardware_mediatek
、hardware_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 QPR3
的LineageOS 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.
恭喜!欢迎来到自助者精英俱乐部。您已经从零开始构建了您的操作系统。你是你的领域的主人,希望你在学习的过程中学到了一些东西,也得到了一些乐趣。
倒在第一步,电脑是几年前的笔记本
By 123 at November 17th, 2024 at 02:36 am.