LineageOS ROM编译

注意:本人非专业 Android 开发者,本文仅供参考,如有错误,欢迎指正!

需要准备的东西

  1. PC 或服务器(家里PC不行的可以上腾讯云或者阿里云买按量计费的服务器,20CNY足矣)
  2. 手机官方刷机包
  3. 国际互联网连接
  4. 手机设备

准备开始

什么是 Prebuilt Vendor, 为什么要用 Prebuilt Vendor

Prebuilt Vendor, 顾名思义, 预编译 Vendor。指的是使用厂商已经编译好的 Vendor 进行 Custom 适配。这样可以大大降低适配难度, 减少适配调试时间。

Google 在 Android 8.0 引入了 PT(Project Treble), 这使得 Android Custom ROM 的适配和调试难度大大降低。再加上今年 Google 再次引入 GRF(Google Requirements Freeze) aka Vendor Freeze, 这使得适配难度再次降低。

在 Android 8.0 之前, 要适配 Custom ROM, 需要通过 AOSP, CAF 或其它芯片, 硬件厂商开源的源码编译设备硬件所需要的运行库, HAL 或驱动, 且每次 Android 大版本升级都需要重新编译, 且极有可能在新版本 Andorid 运行或编译中出现问题, 需要等待源码更新修复或自己手动修复。

在引入 PT, GRF 后, 我们可以直接使用Stock ROM 中的 Vendor, 只需要编译 Kernel 和 System 即可, 且因为 GRF 的引入, Vendor 至少可以兼容 3 个大版本的 Android 更新。(例如小米 12 预装 Android 12, VNDK 版本 32, 则此版本的 Vendor image 至少可以兼容到 Android 15, VNDK 35)

获取安卓设备树和Vendor Blobs

Auto-Firmware-Dumper: Auto-Firmware-Dumper (github.com)

完成之后应该是这样的

[android_vendor_vivo_k71v1_64_bsp]:Vendor Blobs

[lineage_device_vivo_k71v1_64_bsp]:LineageOS Tree

[dump_vivo_k71v1_64_bsp]:ROM的所有解包文件(包括预编译内核,内核DTS,lineage-device-tree,system,vendor)

安装所需依赖

编译环境:Ubuntu 22.0.4

首先是安装必备的软件工具包:

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig repo libncurses5

出现这个按Tab键选择OK

设置git的用户信息:

1
2
git config --global user.name "user name"
git config --global user.email "user@email.com"

创建一个目录

mkdir lineage

然后在这个目录下面初始化Android系统 Repo

同步 LineageOS 源码

1
2
3
初始化 repo
repo init -u https://github.com/LineageOS/android.git -b lineage-19.1 # 同步完整仓库, 带提交历史, 占用空间大
repo init -u https://github.com/LineageOS/android.git -b lineage-19.1 --depth=1 # 仅拉取最新提交, 不带提交历史, 占用空间小

-u后面是LineageOS仓库的清单文件地址, -b是我们要拉出来的代码分支,可以是分支名称,也可以是tag名称。

然后就可以调用repo sync来下载代码了,这个过程可能需要等待几个小时,看你的网速,可以在后面加上-c -j线程数来加快速度,-c表示拉当前分支,-j开启多个线程下载,如:

repo sync -c -j16

下载过程中如果中断了,重新执行这个命令可以继续下载,如果有遇到错误说有.lock文件,去子文件夹的.git文件夹下面找到相关的lock文件删除再重试就行了。

repo在国内有镜像,可以直接去北外或者tuna的源去下载。

1
curl https://mirrors.bfsu.edu.cn/git/git-repo -o ~/bin/repo

因为repo在每次启动时,会检查是否有更新,所以把更新的源也添加进你的.bashrc里。

1
2
export REPO_URL='https://mirrors.bfsu.edu.cn/git/git-repo'
PATH=~/bin:$PATH

同步需要设备所需要的设备树和内核等文件

可以开始编译了吗?并不,刚刚同步的只是系统的主代码,这些代码是各种设备能通用的部分,要使这些代码能够在你的机器上运行,我们还需要有设备独有的代码。这些一般是设备树、内核还有vendor blob.

设备树是你设备编译所需要的参数文件,里面指定了你的设备所需要的有关的配置

内核是你设备运作的核心,里面包含有许多驱动你设备运行的程序,比如wifi,触摸屏,蓝牙等各种硬件的驱动程序,厂商愿不愿意开放该设备的内核源码,就决定了这台设备能不能很好的移植这些第三方的系统。

vendor则是各种外围硬件的驱动,里面一般是一堆的so库,一般绝大多数的内容提取自于官方的rom.

了解了上述的概念,现在就可以去拿所需要的东西了。

手动同步

就是把需要的东西手动放到指定的位置。如果你要构建的系统没在官方的支持范围内,那就需要你自己去找相关的内容。

设备树和内核可以在github上搜索(如果有的话)。

对于设备树,一般搜索的关键词为device_devicecodename,如device_k71v1_64_bsp 。本地工作目录为device/vivo/k71v1_64_bsp

对于内核,一般是kernel_brand_chipsetcode,如kernel_vivo_k71v1_64_bsp 。本地工作目录为kernel/vivo/k71v1_64_bsp

有内核源码可以添加上一步,不过MTK是没有内核源码的,除非手机厂商公开。(这里使用预编译内核)

对于一些设备还需要自己去下载vendor ,本地工作目录为vendor/vivo/k71v1_64_bsp

编译

source build/envsetup.sh

初始化编译环境后

输入lunch 可以看到如下内容:

输入序号,我这里是14,用userdebug

没有错误的话,会显示这些内容:

最后,m bacon 开始编译。

成功后会输出如下内容:

但是我没成功😭

momo54181/android_vendor_vivo_k71v1_64_bsp: Vendor tree for k71v1_64_bsp (github.com)

momo54181/lineage_device_vivo_k71v1_64_bsp: LineageOS compatible tree for k71v1_64_bsp (github.com)

求大佬修复,https://blog.mocn.top/posts/44490

引用内容:

记录再次编译Android系统的坑 | 码农明明桑 (isming.me)

快速上手 Android Custom ROM 适配 - Prebuilt Vendor | Lynnrin’s Blog

Android 自定义系统编译 - 青雨染蓑衣的个人小站 (minetest.top)