本来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