寒假期间买了 MIX2S,换掉了用了大概有3年的一加三。因为已经非常习惯使用原生 Android 系统,所以即便 MIUI 续航更加给力、功能更加丰富,我还是选择使用 LineageOS。目前 MIX2S 机型还没有官方编译版本,但是在 LineageOS 的 Github 仓库中已经有项目了,所以我尝试自己编译了一次。以下为整理出的编译 LineageOS 16.0 的过程。
搭建环境
使用的是 Ubuntu 18.04 LTS,需要至少200G硬盘空间。
安装依赖
sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev repo adb openjdk-8-jdk
初始化仓库
mkdir -p ~/bin
mkdir -p ~/android/lineage
cd ~/android/lineage
repo init -u https://github.com/LineageOS/android.git -b lineage-16.0
感谢某网友提醒,这里可以使用清华 tuna 的镜像,这样下一步就不需要爱国上网了。具体可以参照官方帮助文档。
下载源代码
repo sync
此步骤需要爱国上网,需要下载 30G+ 代码数据。
下载机型代码
mkdir -p ~/android/lineage/device/xiaomi
cd ~/android/lineage/device/xiaomi
git clone https://github.com/LineageOS/android_device_xiaomi_polaris.git polaris
git clone https://github.com/LineageOS/android_device_xiaomi_sdm845-common.git sdm845-common
mkdir -p ~/android/lineage/kernel/xiaomi
cd ~/android/lineage/kernel/xiaomi
git clone https://github.com/LineageOS/android_kernel_xiaomi_sdm845.git sdm845
此外还需要依赖一个 android_packages_resources_devicesettings 也需要同步。
mkdir -p ~/android/lineage/packages/resources
cd ~/android/lineage/packages/resources
git clone https://github.com/LineageOS/android_packages_resources_devicesettings.git -b lineage-16.0
可以把这些仓库写到 .repo/local_manifests/local_manifests.xml
里,这样在运行 repo sync
的时候会自动同步。
提取机型专有文件
从手机中提取
一般来说只要进入 ~/android/lineage/device/xiaomi/polaris
文件夹,连上手机,然后运行 extract-files.sh
,脚本自动通过 adb 从手机中提取文件。但是我遇到了几个提取不到的文件,只好去 MIUI 的包里提取才搞定。
从刷机包中提取
新建一个临时文件夹
mkdir ~/android/system_dump/
cd ~/android/system_dump/
从刷机包中解压 system.transfer.list
和 system.new.dat
。需要注意的就是可能有的包里 system.new.dat
是使用 Brotli 压缩过的 system.new.dat.br
,需要先解压。
sudo apt install brotli
brotli -d system.new.dat.br -o system.new.dat
然后需要使用 sdat2img
将 block-based 的包转化成可挂载的 img 文件。
git clone https://github.com/xpirt/sdat2img
python sdat2img/sdat2img.py system.transfer.list system.new.dat system.img
mkdir system/
sudo mount system.img system/
然后再执行 extract-files.sh
脚本提取文件。
./extract-files.sh ~/android/system_dump/
提取完成后删除临时目录
sudo umount ~/android/system_dump/system
rm -rf ~/android/system_dump/
开启 CCACHE
export USE_CCACHE=1
当然也可以加入到 ~/.bashrc
中。然后设置 ccache 缓存上限。
ccache -M 50G
一般来说,如果只是编译一个机型,25GB-50GB就可以了。
开始编译
cd ~/android/lineage/
source build/envsetup.sh
brunch polaris
编译完成后
cd $OUT
就能找到刷机包了 lineage-16.0-20190222-UNOFFICIAL-polaris.zip
结语
总的来说,编译 LineageOS 并不是一件困难的事情,主要是需要耐心。毕竟代码都已经写好了,而我只是一个搬运工。