本來(lái)AOSP也是編譯完了,但只能跑在模擬器上血淌。由于沒(méi)有谷歌親兒子矩欠,打算利用一下手上的一批老年機(jī)。從小米、魅族癌淮,華為躺坟、三星等等各種找到的手機(jī)里面最后選擇了三星S4(因?yàn)樗碾姵胤浅:茫?/p>
因?yàn)楹笃谛枰薷陌沧肯到y(tǒng)的源碼,所以要找開(kāi)源且社區(qū)活躍一些的os该默。開(kāi)始一波搜索瞳氓,除了AOSP以外,活躍且開(kāi)源的Android OS屈指可數(shù)栓袖。最后選擇了lineage OS
,這是基于已經(jīng)不再維護(hù)的CM系統(tǒng)繼續(xù)開(kāi)發(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
開(kāi)始初始化
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包中提取嘴办。這里采用后者,更加方便买鸽。
方法參見(jiàn)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).
然后開(kāi)始編譯吧(中途如果提示少包瑟俭,就按照提示裝上即可翎卓。如果預(yù)裝了本文開(kāi)頭的包契邀,那就沒(méi)問(wèn)題了)
croot
brunch jfltexx
注:注意一下我的java版本號(hào)
如果要給build簽名摆寄,參見(jiàn)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必不可少。聽(tīng)網(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的方法參見(jiàn)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)容后打開(kāi)百度網(wǎng)盤手機(jī)App,操作更方便哦
刷入系統(tǒng)
一般來(lái)說(shuō)用TWRP直接卡刷放入的zip包即可款侵。但是刷的時(shí)候提示devices unknown和已知的設(shè)備不同末荐,不讓刷。遂修改卡刷包里的
META-INF/com/google/android/updater-script
,把最前面的assert去掉以后新锈,重新保存打包即可刷入甲脏。
參見(jiàn)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海渊,參見(jiàn)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