記一次折騰的lineageOS編譯

本來(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容