LineageOS ROM编译
LineageOS ROM编译
注意:本人非专业 Android 开发者,本文仅供参考,如有错误,欢迎指正!
需要准备的东西
- PC 或服务器(家里PC不行的可以上腾讯云或者阿里云买按量计费的服务器,20CNY足矣)
- 手机官方刷机包
- 国际互联网连接
- 手机设备
准备开始
什么是 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 | git config --global user.name "user name" |
创建一个目录
mkdir lineage
然后在这个目录下面初始化Android系统 Repo
同步 LineageOS 源码
1 | 初始化 repo |
-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 | export REPO_URL='https://mirrors.bfsu.edu.cn/git/git-repo' |
同步需要设备所需要的设备树和内核等文件
可以开始编译了吗?并不,刚刚同步的只是系统的主代码,这些代码是各种设备能通用的部分,要使这些代码能够在你的机器上运行,我们还需要有设备独有的代码。这些一般是设备树、内核还有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