本來(lái)AOSP也是編譯完了,但只能跑在模擬器上。由于沒(méi)有谷歌親兒子,打算利用一下手上的一批老年機(jī)。從小米、魅族,華為、三星等等各種找到的手機(jī)里面最后選擇了三星S4(因?yàn)樗碾姵胤浅:茫?/p>
因?yàn)楹笃谛枰薷陌沧肯到y(tǒng)的源碼,所以要找開源且社區(qū)活躍一些的os。開始一波搜索,除了AOSP以外,活躍且開源的Android OS屈指可數(shù)。最后選擇了lineage OS,這是基于已經(jīng)不再維護(hù)的CM系統(tǒng)繼續(xù)開發(fā)的,而且適配的機(jī)型相當(dāng)多。
源碼準(zhǔn)備
首先就是去官網(wǎng)找對(duì)應(yīng)機(jī)型的安裝說(shuō)明。
比如這是S4的build說(shuō)明
前面的步驟和AOSP編譯步驟一樣,安裝一些依賴庫(kù)
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路徑。
這里百度網(wǎng)盤上傳了openjdk-11.04_linux.tar.gz的版本
鏈接:https://pan.baidu.com/s/10gGqdTC5JAawWe8VtjH2DQ
提取碼:n7b1
而后創(chuàng)建源碼目錄
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文件
- 將
<remote name="github"
fetch=".."
review="review.lineageos.org" />
修改為
<remote name="github"
fetch="https://github.com/" />
<remote name="lineage"
fetch="https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/"
review="review.lineageos.org" />
- 將
<remote name="aosp"
fetch="https://android.googlesource.com"
修改為
<remote name="aosp"
fetch="https://aosp.tuna.tsinghua.edu.cn"
- 將
<default revision="..."
remote="github"
修改為
<default revision="..."
remote="lineage"
修改完之后的前半部分:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="github"
fetch="https://github.com/" />
<remote name="lineage"
fetch="https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/"
review="review.lineageos.org" />
<remote name="private"
fetch="ssh://git@github.com" />
<remote name="aosp"
fetch="https://aosp.tuna.tsinghua.edu.cn"
review="android-review.googlesource.com"
revision="refs/tags/android-9.0.0_r46" />
<default revision="refs/heads/lineage-16.0"
remote="lineage"
sync-c="true"
sync-j="4" />
然后下載源碼
repo sync -c -j8 --no-clone-bundle
-
--no-clone-bundle可以避免bundle的警告 -
-c僅同步當(dāng)前分支
如果網(wǎng)絡(luò)波動(dòng)大,可以用下面的腳本
#!/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
可以從已經(jīng)安裝lineageOS的同機(jī)型設(shè)備中提取(https://wiki.lineageos.org/devices/jfltexx/build#extract-proprietary-blobs)。
還可以從全量包或者OTA包中提取。這里采用后者,更加方便。
方法參見https://wiki.lineageos.org/extracting_blobs_from_zips.html
首先下載對(duì)應(yīng)設(shè)備的lineageOS全量包,
然后
mkdir ~/android/system_dump/
cd ~/android/system_dump/
然后提取
unzip path/to/lineage-*.zip system.transfer.list system.new.dat*
如果提取出來(lái)的文件有system.new.dat.br(a brotli archive),要先用brotli來(lái)解壓
sudo apt-get install brotli
brotli --decompress --output=system.new.dat system.new.dat.br
然后用sdat2img腳本轉(zhuǎn)換鏡像
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就會(huì)提取到~/android/lineage/vendor/samsung中了。注意,這里給extract-files.sh傳的路徑并不包括system目錄,因?yàn)檫@個(gè)腳本內(nèi)部會(huì)自動(dòng)去找傳入目錄下的system目錄。
最后取消掛載
sudo umount ~/android/system_dump/system
rm -rf ~/android/system_dump/
驗(yàn)證源碼
這一步是驗(yàn)證之前所有工作的成功與否了。如果有源碼確實(shí)的錯(cuò)誤,例如缺少***mk,可能是之前源碼sync沒(méi)有完整,建議重新repo sync -c一遍(速度還是很快的),也可能是blob沒(méi)有提取出來(lái)。
對(duì)于三星S4
source build/envsetup.sh
breakfast jfltexx
如果沒(méi)有報(bào)錯(cuò),那么就成功了一半了。
編譯
使用ccache加速編譯過(guò)程(用空間換時(shí)間)
sudo apt install ccache -y
然后設(shè)置大小
export USE_CCACHE=1
ccache -M 50G
export CCACHE_COMPRESS=1
可以把export加到bashrc文件中。
關(guān)于給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).
然后開始編譯吧(中途如果提示少包,就按照提示裝上即可。如果預(yù)裝了本文開頭的包,那就沒(méi)問(wèn)題了)
croot
brunch jfltexx
注:注意一下我的java版本號(hào)

如果要給build簽名,參見https://wiki.lineageos.org/signing_builds.html
最后編譯成功的話,會(huì)顯示
#### build completed successfully (01:06 (mm:ss)) ####

然后去生成目錄看一眼
cd $OUT

這其中的
lineage-16.0-20200327-UNOFFICIAL-jfltexx.zip就是卡刷包了。recovery.img是對(duì)應(yīng)的recovery鏡像。
刷入recovery
為了把卡刷包刷入手機(jī),一個(gè)好用的recovery必不可少。聽網(wǎng)上有說(shuō)lineageOS的那個(gè)recovery不太好刷,而且我之前給小米用的也是TWRP,所以這里就給三星S4刷TWRP了。
TWRP可以在這里找到對(duì)應(yīng)的包。但是我找了對(duì)應(yīng)s4的,結(jié)果只找到一個(gè)app,提示說(shuō)要用app去下載對(duì)應(yīng)的包,太麻煩了。于是百度上搜到一個(gè)適用于S4(l905/l908的高通版本)的TWRP
S4(l905/l908的高通版本)的TWRP傳到百度網(wǎng)盤了
鏈接:https://pan.baidu.com/s/1imUT-pGiLjaX1Ji80ay0aA
提取碼:wk3v
給三星手機(jī)刷入recovery的方法參見lineageOS官方
https://wiki.lineageos.org/devices/jfltexx/install
因?yàn)槿堑膄astboot和別的手機(jī)不太一樣,其稱為downloading模式,所以即使裝好了三星驅(qū)動(dòng),但是fastboot device還是識(shí)別不出來(lái)。三星官方給了一個(gè)Odin的軟件,可以用來(lái)刷入recovery,然后在AP那里要求tar壓縮包,嘗試把img壓縮為tar然后寫進(jìn)去失敗了。
最后還是lineageOS給的刷recovery的方法好。具體就不重復(fù)說(shuō)明了,參看https://wiki.lineageos.org/devices/jfltexx/install
注意,要先把三星手機(jī)的驅(qū)動(dòng)裝上。
其中用到的Heimdall-Windows:https://pan.baidu.com/s/1DnN6CSygz0ppcfb6RqJAag
提取碼:66qo
復(fù)制這段內(nèi)容后打開百度網(wǎng)盤手機(jī)App,操作更方便哦
刷入系統(tǒng)
一般來(lái)說(shuō)用TWRP直接卡刷放入的zip包即可。但是刷的時(shí)候提示devices unknown和已知的設(shè)備不同,不讓刷。遂修改卡刷包里的
META-INF/com/google/android/updater-script,把最前面的assert去掉以后,重新保存打包即可刷入。
參見https://forum.xda-developers.com/showthread.php?t=2522762
安裝root
lineageOS 16.0提供了root權(quán)限,但是缺少su的二進(jìn)制。
在官網(wǎng)找到extra里的su二進(jìn)制
https://download.lineageos.org/extras
三星S4是arm平臺(tái),所以是addonsu-16.0-arm-signed.zip,然后adb push到sdcard,TWRP卡刷入即可。
λ adb shell
jfltexx:/ $ su
:/ #
注:如果是16.0以上的版本,官方默認(rèn)采用Magisk作為root權(quán)限管理,也就不用官方提供的su了。
如果想裝Magisk,參見https://github.com/topjohnwu/Magisk/releases
總結(jié)
一些adb命令
重啟進(jìn)入fastboot
adb reboot bootloader
重啟進(jìn)入recovery
adb reboot recovery
參考
編譯刷機(jī)的過(guò)程漫長(zhǎng)且困難連連,有幾篇文章還是比較系統(tǒng)的
https://blog4jimmy.com/2018/11/656.html