Kali编译LineageOS-19.1 for 小米8se


前言

  之前一篇文章中已经完成了kali虚拟机的一些基本环境的搭建,现在我们开始用kali进行Lineage源码编译。整个流程基本上说按照官方wiki来的,但是肯定会踩不少坑,即使是完全照着这篇文章来,也不一定会成功,但是还是记录一下踩坑记录。

安装必要依赖

  首先根据官网要求先安装一些必要的依赖,最好用kali自己的apt源,不然可能出错

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

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo

配置环境变量

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo' >> ~/.bashrc
source ~/.bashrc

参考清华源

初始化源码

这一步只是指定你要同步哪个版本的源码,还没有正式开始同步

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左右的流量就这么没了。

repo sync -j8 --fail-fast

遇到问题可以repo sync -h来查看帮助

只要网络没问题,这一步虽然耗时但是也应该没啥其他问题存在了。

踩坑

  之前编译18.1的话,我是在实验室服务器上进行的,走到这一步不出意外的话直接进行编译就能完成了。但是19.1我在自己的虚拟机中进行就出意外了,踩了两个坑,记录一下。

Neverallow failures occurred Error while expanding policy

  编译到51%左右编译停止了,往上翻报错记录找到以下内容:

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够用。

开始编译

启用缓存加速(可选)

export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache

ccache -M 50G
ccache -o compression=true

编译

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文件夹也要删掉。

签名安装包(可选)

参考官方文档
签名完成后可能会有故障。

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
breakfast <codename>
mka target-files-package otatools
croot
sign_target_files_apks -o -d ~/.android-certs \
    $OUT/obj/PACKAGING/target_files_intermediates/*-target_files-*.zip \
    signed-target_files.zip
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模式,然后使用命令

adb sideload rom.zip # 编译完成的rom的路径

这边如果出现手机端和PC端的进度不一致不要紧张,以手机端为准就行,PC端大概在45%左右直接结束,网上能查到原因,问题不大。另外如果刷以后出现wifi用不了或者其他什么故障可以尝试先给手机刷个最新版本的bootloader和radio。


文章作者: AshenOne
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AshenOne !
评论
  目录