前言
之前一篇文章中已经完成了kali虚拟机的一些基本环境的搭建,现在我们开始用kali进行Lineage源码编译。整个流程基本上说按照官方wiki来的,但是肯定会踩不少坑,即使是完全照着这篇文章来,也不一定会成功,但是还是记录一下踩坑记录。
安装必要依赖
首先根据官网要求先安装一些必要的依赖,最好用kali自己的apt源,不然可能出错
代码语言:javascript复制sudo apt install bc bison build-essential ccache curl flex git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev g -multilib gcc-multilib lib32z1-dev
然后根据wiki说明应该还要安装一个libwxgtk3.0-dev
,但是死活找不到,网上有人说它已经被改名为libwxgtk3.0-gtk3-dev
,于是将其安装即可,虽然不知道缺了它会不会出事,但是安装这个以后是能完成整个编译过程的。
配置platform-tool(可选)
具体参考官方wiki,其实自己安装一下adb和fastboot就可以跳过这一步了
下载repo
下载repo
代码语言:javascript复制curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod x repo
配置环境变量
代码语言:javascript复制export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo' >> ~/.bashrc
source ~/.bashrc
参考清华源
初始化源码
这一步只是指定你要同步哪个版本的源码,还没有正式开始同步
代码语言:javascript复制repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/LineageOS/android.git -b lineage-19.1
提取专有 blob
这一步有不同情况有不同方式:
- 对于官方支持的机型,可以使用官方wiki的教程中提到的两种方式:从已经刷了lineage的手机中提取,或者从刷机包中提取,具体参考官方wiki。
- 对于所有机型,将vendor手动下载到根目录或者将其配置到repo中重新sync。
这里只介绍网上教程很少提到的第二种方式,参考如何给Xiaomi 4C编译LineageOS 18.1
对于小米8se,官方并未支持这台设备,需要民间提供设备配置和vendor,可以在github中找到相关项目
使用方法:
在“.repo”的目录下,创建local_manifests
目录,创建文件:“roomservice.xml”然后把github中的内容复制过去
注意如果原来的文件中使用了fetch=”ssh://git@github.com要将其改成fetch=”https://github.com
这个文件里面的第一、二、三个project分别是”sirius”、”pyxis”和”grus”,其中pyxis
在我发这篇文章时是没有19.1版本的,所以在源码同步的时候会报错,但是无关紧要,我们只要sirius就行了,因为另外两个是给其他机型用的,不是小米8se所需要的,我们直接在文件中把这两行删掉就完事了,最后“roomservice.xml”的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="sdm710-dev"
fetch="https://github.com/SDM710-Development" />
<project name="android_device_xiaomi_sirius" path="device/xiaomi/sirius" revision="lineage-19.1" remote="sdm710-dev" />
<project name="android_device_xiaomi_sdm710-common" path="device/xiaomi/sdm710-common" revision="lineage-19.1" remote="sdm710-dev" />
<project name="android_kernel_xiaomi_sdm710" path="kernel/xiaomi/sdm710" revision="10.0-caf" remote="sdm710-dev" />
<project name="proprietary_vendor_xiaomi" path="vendor/xiaomi" revision="lineage-19.1" remote="sdm710-dev" />
<remove-project name="LineageOS/android_hardware_qcom_display" />
<project name="hardware_qcom_display-caf" path="hardware/qcom-caf/sdm845/display" revision="twelve" remote="sdm710-dev" />
</manifest>
顺便记下google设备的vendor
这种方法在官方wiki中并没有提到,所以知道的人相对少一些,我联系到一个负责维护lineageOS给google设备做适配的contributor,他告诉我这是因为公开这些官方vendor涉及到了法律的灰色地带。使用这种方式的好处是能够刷到最新版本的vendor,而不是从旧版本的lineage中去提取。我想编译一个lineage首先我得有一个现成的编译好的rom,这很怪,就好像我想吃鸡蛋首先我得养只鸡,但是我没有鸡蛋所以我养不出鸡(不太恰当的比喻)。
同步源码
清华源貌似没啥大用,最后还是挂的梯子,90G左右的流量就这么没了。
代码语言:javascript复制repo sync -j8 --fail-fast
遇到问题可以repo sync -h
来查看帮助
只要网络没问题,这一步虽然耗时但是也应该没啥其他问题存在了。
踩坑
之前编译18.1的话,我是在实验室服务器上进行的,走到这一步不出意外的话直接进行编译就能完成了。但是19.1我在自己的虚拟机中进行就出意外了,踩了两个坑,记录一下。
Neverallow failures occurred Error while expanding policy
编译到51%左右编译停止了,往上翻报错记录找到以下内容:
代码语言:javascript复制FAILED: out/target/product/grus/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows
/bin/bash -c "(ASAN_OPTIONS=detect_leaks=0 out/host/linux-x86/bin/checkpolicy -M -c 30 -o out/target/product/grus/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows.tmp out/target/product/grus/obj/FAKE/sepolicy_neverallows_intermediates/policy.conf ) && (out/host/linux-x86/bin/sepolicy-analyze out/target/product/grus/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows.tmp neverallow -w -f out/target/product/grus/obj/FAKE/sepolicy_neverallows_intermediates/policy_2.conf || ( echo "" 1>&2; echo "sepolicy-analyze failed. This is most likely due to the use" 1>&2; echo "of an expanded attribute in a neverallow assertion. Please fix" 1>&2; echo "the policy." 1>&2; exit 1 ) ) && (touch out/target/product/grus/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows.tmp ) && (mv out/target/product/grus/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows.tmp out/target/product/grus/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows )"
libsepol.report_failure: neverallow on line 960 of system/sepolicy/public/domain.te (or line 13907 of policy.conf) violated by allow clean_scratch_files clean_scratch_files_exec:file { entrypoint };
libsepol.check_assertions: 1 neverallow failures occurred
Neverallow failures occurred Error while expanding policy
谷歌搜索了一下Neverallow failures occurred Error while expanding policy
,发现是sepolicy的问题,根据上面的报错信息libsepol.report_failure: neverallow on line 960 of system/sepolicy/public/domain.te (or line 13907 of policy.conf) violated by allow clean_scratch_files clean_scratch_files_exec:file { entrypoint };
知道问题出在system/sepolicy/public/domain.te
的960行,直接给它注释掉就行了。
一开始还以为是源码同步出错,结果重试了几次都是一样的问题,属实浪费时间。
ninja failed with: exit status 137
报错出现在98%左右,人都快崩溃了,直接搜索这个报错信息,发现是内存不够导致的,直接给它拉满内存就行了,目测24G够用。
开始编译
启用缓存加速(可选)
代码语言:javascript复制export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
ccache -M 50G
ccache -o compression=true
编译
代码语言:javascript复制source build/envsetup.sh
breakfast sirius # 换成自己的设备名
croot
brunch sirius # 换成自己的设备名
注意如果上一步没有完成的话这里直接breakfast sirius
会提示找不到相关文件,然后去lineage官网去自动同步,这时候他会去同步sony的sirius机型,而不是小米8se,因为两个设备重名了,而官方只支持sony的机子。如果发生了这个情况可能会污染repo,要去.repo/local_manifests/roomservice.xml
里把自动生成的sony的sirius记录给删掉,vendor和device目录下的sony文件夹也要删掉。
签名安装包(可选)
参考官方文档 签名完成后可能会有故障。
代码语言:javascript复制subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
mkdir ~/.android-certs
for x in releasekey platform shared media networkstack testkey; do
./development/tools/make_key ~/.android-certs/$x "$subject";
done
代码语言:javascript复制breakfast <codename>
mka target-files-package otatools
代码语言:javascript复制croot
sign_target_files_apks -o -d ~/.android-certs
$OUT/obj/PACKAGING/target_files_intermediates/*-target_files-*.zip
signed-target_files.zip
代码语言:javascript复制ota_from_target_files -k ~/.android-certs/releasekey
--block --backup=true
signed-target_files.zip
signed-ota_update.zip
刷机
不推荐用twrp的卡刷,可能会出奇奇怪怪的问题,使用twrp或者lineage官方recovery,进入adb sideload模式,然后使用命令
代码语言:javascript复制adb sideload rom.zip # 编译完成的rom的路径
这边如果出现手机端和PC端的进度不一致不要紧张,以手机端为准就行,PC端大概在45%左右直接结束,网上能查到原因,问题不大。另外如果刷以后出现wifi用不了或者其他什么故障可以尝试先给手机刷个最新版本的bootloader和radio。