記一次折騰的lineageOS編譯

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市臣疑,隨后出現(xiàn)的幾起案子盔憨,更是在濱河造成了極大的恐慌,老刑警劉巖讯沈,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郁岩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缺狠,警方通過(guò)查閱死者的電腦和手機(jī)问慎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挤茄,“玉大人蝴乔,你說(shuō)我怎么就攤上這事⊥苑” “怎么了薇正?”我有些...
    開(kāi)封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)囚衔。 經(jīng)常有香客問(wèn)我挖腰,道長(zhǎng),這世上最難降的妖魔是什么练湿? 我笑而不...
    開(kāi)封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任猴仑,我火速辦了婚禮,結(jié)果婚禮上肥哎,老公的妹妹穿的比我還像新娘辽俗。我一直安慰自己,他們只是感情好篡诽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布崖飘。 她就那樣靜靜地躺著,像睡著了一般杈女。 火紅的嫁衣襯著肌膚如雪朱浴。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天达椰,我揣著相機(jī)與錄音翰蠢,去河邊找鬼。 笑死啰劲,一個(gè)胖子當(dāng)著我的面吹牛梁沧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蝇裤,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼廷支,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼埃碱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起酥泞,我...
    開(kāi)封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啃憎,沒(méi)想到半個(gè)月后芝囤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辛萍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年悯姊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贩毕。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悯许,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辉阶,到底是詐尸還是另有隱情先壕,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布谆甜,位于F島的核電站垃僚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏规辱。R本人自食惡果不足惜谆棺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罕袋。 院中可真熱鬧改淑,春花似錦、人聲如沸浴讯。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榆纽。三九已至侍郭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掠河,已是汗流浹背亮元。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唠摹,地道東北人爆捞。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像勾拉,于是被迫代替她去往敵國(guó)和親煮甥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盗温,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容