记一次折腾的lineageOS编译

本来AOSP也是编译完了,但只能跑在模拟器上。由于没有谷歌亲儿子,打算利用一下手上的一批老年机。从小米、魅族,华为、三星等等各种找到的手机里面最后选择了三星S4(因为它的电池非常好)。

因为后期需要修改安卓系统的源码,所以要找开源且社区活跃一些的os。开始一波搜索,除了AOSP以外,活跃且开源的Android OS屈指可数。最后选择了lineage OS,这是基于已经不再维护的CM系统继续开发的,而且适配的机型相当多。

源码准备

首先就是去官网找对应机型的安装说明。
比如这是S4的build说明
前面的步骤和AOSP编译步骤一样,安装一些依赖库

sudo apt install -y 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

而后安装OpenJDK具体版本看os的要求。装好之后用update-alternative配置好java,javac,jar路径。

这里百度网盘上传了openjdk-11.04_linux.tar.gz的版本
链接:https://pan.baidu.com/s/10gGqdTC5JAawWe8VtjH2DQ
提取码:n7b1

而后创建源码目录

mkdir -p ~/android/lineage

然后安装repo (连不上可以用清华源)

sudo curl https://storage.googleapis.com/git-repo-downloads/repo > /usr/bin/repo
chmod a+x /usr/bin/repo

开始初始化

cd ~/android/lineage
repo init -u https://github.com/LineageOS/android.git -b lineage-16.0

init后修改一下.repo/manifests/default.xml文件

  

修改为

  

  
  

修改为

  
  

修改为

  

修改完之后的前半部分:




  

  

  

  

  

然后下载源码

repo sync -c -j8 --no-clone-bundle
  • --no-clone-bundle 可以避免bundle的警告
  • -c仅同步当前分支
    如果网络波动大,可以用下面的脚本
#!/bin/bash  
echo "======start repo sync======"  
repo sync -j8 -c
while [ $? = 1 ]; do  
        echo "======sync failed, re-sync again======"  
        sleep 3  
        repo sync -j8 -c
done 

下载好的repo初始化包
链接:https://pan.baidu.com/s/1SVTfeLiwT9uiVgBYPTfhiA
提取码:12pt
下载解压后直接repo sync -l一遍就能提取源码了。

提取proprietary blobs

可以从已经安装lineageOS的同机型设备中提取(https://wiki.lineageos.org/devices/jfltexx/build#extract-proprietary-blobs)。
还可以从全量包或者OTA包中提取。这里采用后者,更加方便。
方法参见https://wiki.lineageos.org/extracting_blobs_from_zips.html
首先下载对应设备的lineageOS全量包,
然后

mkdir ~/android/system_dump/
cd ~/android/system_dump/

然后提取

unzip path/to/lineage-*.zip system.transfer.list system.new.dat*

如果提取出来的文件有system.new.dat.br(a brotli archive),要先用brotli来解压

sudo apt-get install brotli
brotli --decompress --output=system.new.dat system.new.dat.br

然后用sdat2img脚本转换镜像

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/

而后就能在编译目录中提取blob了

cd  ~/android/lineage/device/samsung/jfltexx 
./extract-files.sh ~/android/system_dump/

然后所有的blob就会提取到~/android/lineage/vendor/samsung中了。注意,这里给extract-files.sh传的路径并不包括system目录,因为这个脚本内部会自动去找传入目录下的system目录。
最后取消挂载

sudo umount ~/android/system_dump/system
rm -rf ~/android/system_dump/

验证源码

这一步是验证之前所有工作的成功与否了。如果有源码确实的错误,例如缺少***mk,可能是之前源码sync没有完整,建议重新repo sync -c一遍(速度还是很快的),也可能是blob没有提取出来。
对于三星S4

source build/envsetup.sh
breakfast jfltexx

如果没有报错,那么就成功了一半了。

编译

使用ccache加速编译过程(用空间换时间)

sudo apt install ccache -y

然后设置大小

export USE_CCACHE=1
ccache -M 50G
export CCACHE_COMPRESS=1

可以把export加到bashrc文件中。

关于给ccache的大小,官方的原文
where 50G corresponds to 50GB of cache. This needs to be run once. Anywhere from 25GB-100GB will result in very noticeably increased build speeds (for instance, a typical 1hr build time can be reduced to 20min). If you’re only building for one device, 25GB-50GB is fine. If you plan to build for several devices that do not share the same kernel source, aim for 75GB-100GB. This space will be permanently occupied on your drive, so take this into consideration.
You can also enable the optional ccache compression. While this may involve a slight performance slowdown, it increases the number of files that fit in the cache. To enable it, run:

NOTE: If compression is enabled, the ccache size can be lower (aim for approximately 20GB for one device).

然后开始编译吧(中途如果提示少包,就按照提示装上即可。如果预装了本文开头的包,那就没问题了)

croot
brunch jfltexx

注:注意一下我的java版本号


如果要给build签名,参见https://wiki.lineageos.org/signing_builds.html

最后编译成功的话,会显示

#### build completed successfully (01:06 (mm:ss)) ####

然后去生成目录看一眼

cd $OUT


这其中的lineage-16.0-20200327-UNOFFICIAL-jfltexx.zip就是卡刷包了。recovery.img是对应的recovery镜像。

刷入recovery

为了把卡刷包刷入手机,一个好用的recovery必不可少。听网上有说lineageOS的那个recovery不太好刷,而且我之前给小米用的也是TWRP,所以这里就给三星S4刷TWRP了。

TWRP可以在这里找到对应的包。但是我找了对应s4的,结果只找到一个app,提示说要用app去下载对应的包,太麻烦了。于是百度上搜到一个适用于S4(l905/l908的高通版本)的TWRP

S4(l905/l908的高通版本)的TWRP传到百度网盘了
链接:https://pan.baidu.com/s/1imUT-pGiLjaX1Ji80ay0aA
提取码:wk3v

给三星手机刷入recovery的方法参见lineageOS官方
https://wiki.lineageos.org/devices/jfltexx/install

因为三星的fastboot和别的手机不太一样,其称为downloading模式,所以即使装好了三星驱动,但是fastboot device还是识别不出来。三星官方给了一个Odin的软件,可以用来刷入recovery,然后在AP那里要求tar压缩包,尝试把img压缩为tar然后写进去失败了。
最后还是lineageOS给的刷recovery的方法好。具体就不重复说明了,参看https://wiki.lineageos.org/devices/jfltexx/install
注意,要先把三星手机的驱动装上。

其中用到的Heimdall-Windows:https://pan.baidu.com/s/1DnN6CSygz0ppcfb6RqJAag
提取码:66qo
复制这段内容后打开百度网盘手机App,操作更方便哦

刷入系统

一般来说用TWRP直接卡刷放入的zip包即可。但是刷的时候提示devices unknown和已知的设备不同,不让刷。遂修改卡刷包里的
META-INF/com/google/android/updater-script,把最前面的assert去掉以后,重新保存打包即可刷入。
参见https://forum.xda-developers.com/showthread.php?t=2522762

安装root

lineageOS 16.0提供了root权限,但是缺少su的二进制。
在官网找到extra里的su二进制
https://download.lineageos.org/extras
三星S4是arm平台,所以是addonsu-16.0-arm-signed.zip,然后adb push到sdcard,TWRP卡刷入即可。

λ adb shell
jfltexx:/ $ su
:/ #

注:如果是16.0以上的版本,官方默认采用Magisk作为root权限管理,也就不用官方提供的su了。

如果想装Magisk,参见https://github.com/topjohnwu/Magisk/releases

总结

一些adb命令

重启进入fastboot

adb reboot bootloader

重启进入recovery

adb reboot recovery

参考

编译刷机的过程漫长且困难连连,有几篇文章还是比较系统的
https://blog4jimmy.com/2018/11/656.html

你可能感兴趣的:(记一次折腾的lineageOS编译)