因為想修改Linux核心設定檔(kernel config),所以學習如何編譯LineageOS ROM。參考LineageOS Wiki和XDA教學後編譯後,遂將過程記敘於此。
這篇不是LineageOS移植教學,而是修改現有的LineageOS ROM原始碼並重新編譯。可視需求只編譯核心(刷核心/內核),或是整個ROM重新編譯。
LineageOS Wiki,Sony Xperia 5 II (pdx206)的支援狀態現在是Official
。
未來如果進入unofficial的話,Xperia 5 II的機型設定檔通常還會留在LineageOS儲存庫,我們還是可以用它編譯ROM。
1. 前置作業#
參見 Xperia 5 II Root教學,解鎖bootloader。
為方便測試已刷成別人做好的LineageOS 20,確認刷機功能正常後我才開搞。
編譯ROM需要一台x86架構64位元Linux系統的電腦,官方Wiki建議是Ubuntu,我使用Ubuntu 22.04 LTS。
下載LineageOS原始碼需要約50~100GB的硬碟空間,編譯ROM需要準備至少250GB的硬碟空間,且最好是SSD。
編譯ROM至少需要16GB RAM,Android 12以後可能需要32GB RAM。可用SWAP或SWAP file增加RAM。
下載檔案約需要1小時,視網路速度而定。
四核心CPU Intel i5 7400編譯Linux核心約30分鐘,編譯整個ROM約6小時。
2. 安裝編譯工具#
雖然有些工具Linux套件庫有收,不過保險起見還是手動裝LineageOS Wiki建議的版本。
2.1. 安裝Platform Tools#
Platform Tools內含ADB和Fastboot。
- 從Google官網下載platform-tools。
wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
- 解壓縮到家目錄
unzip platform-tools-latest-linux.zip -d ~
- 用VIM編輯
~/.profile
,將platform-tools加入PATH
# add Android SDK platform tools to path
if [ -d "$HOME/platform-tools" ] ; then
PATH="$HOME/platform-tools:$PATH"
fi
- 重新載入環境變數
source ~/.profile
2.2. 安裝編譯依賴套件#
Ubuntu 22.04請安裝以下套件
sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev lib32ncurses5-dev libncurses5 libncurses5-dev
2.3. 安裝Java#
LineageOS 18以上需要OpenJDK 11。
安裝OpenJDK:
sudo apt install openjdk-11-jdk
2.4. 安裝Python#
Lineageos 17以上需要Python 3,Ubuntu還得將python指令指向python3,因此安裝:
sudo apt install python3 python-is-python3
2.5. 建立工作目錄#
建立存放工具和Android原始碼的目錄,不要有中文。
mkdir -p ~/bin
mkdir -p ~/android/lineage
2.6. 安裝repo工具#
repo是用於同步儲存庫的工具。
- 將repo安裝至
~/bin
目錄:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
- 用VIM編輯
~/.profile
,將bin目錄加入PATH:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
- 重新載入環境變數
source ~/.profile
2.7. 設定git資訊#
設定Git的聯絡資訊
git config --global user.email "電郵"
git config --global user.name "名字"
3. 設定ccache#
選擇性步驟。如果要多次重複編譯ROM,設定ccache能節省下次編譯的時間,但是會佔用更多硬碟空間。
啟用CCACHE,並分配50GB硬碟作為快取空間
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
ccache -M 50G
4. 下載原始碼與裝置設定檔#
4.1. 同步儲存庫#
- 同步LineageOS的原始碼儲存庫,選擇
lineage-20
的分支。repo同步的時候很吃網速,如果速度太慢導致發生錯誤就把j8改成j1。
cd ~/android/lineage
repo init -u https://github.com/LineageOS/android.git -b lineage-20.0 --depth=1
repo sync -c -j8
- 接下來讓repo sync自動下載LineageOS裝置的設定檔,這裡是pdx206。
source build/envsetup.sh
breakfast pdx206
repo sync -c -j8
- 沒抽取專有驅動程式會遇到
vendor error .mk does not exist
錯誤,這是正常的。等跑完下面的抽取步驟,再跑一次breakfast
指令即可。
cd ~/android/lineage
breakfast pdx206
repo sync -c -j8
4.2. 抽取Sony專有驅動程式#
參考 LineageOS Wiki瞭解如何抽取專有驅動程式(proprietary blobs)。
專有驅動程式可以從刷機包、OTA包、實體機抽取,我是從Sony原廠韌體抽取。我們要找到system.img,LineageOS的指令稿才能抽出專有驅動程式。
透過 XperiFirm下載Xperia 5 II(pdx206)的韌體。Linux可以用Wine跑。
切換到韌體解壓縮的目錄,例如
~/XQ-AS72_Customized_TW_58.2.A.10.126
cd ~/XQ-AS72_Customized_TW_58.2.A.10.126
- 下載
Sony Dump Tool,解開
super_X-FLASH-ALL-2389.sin
(即super.img)至output
目錄,得到super_X-FLASH-ALL-2389.bin
/sony_dump.x86_64 output super_X-FLASH-ALL-2389.sin
- 編譯
Super image tools工具,得到執行檔
superunpack
cd ~
git clone https://github.com/munjeni/super_image_dumper.git
cd super_image_dumper
make
- 將
superunpack
移動到super_X-FLASH-ALL-2389.bin
所在的目錄
chmod +x superunpack
mv superunpack ~/XQ-AS72_Customized_TW_58.2.A.10.126/output
cd ~/XQ-AS72_Customized_TW_58.2.A.10.126/output
- 解出
system_a.ext4
(即system.img)、vendor_a.ext4
、odm_a.ext4
、product_a.ext4
./superunpack /super_X-FLASH-ALL-2389.bin
- 建立工作目錄
mkdir ~/android/system_dump/
cd ~/android/system_dump/
# 將super_X-FLASH-ALL-2389.bin解出的檔案放到此目錄
mv ~/XQ-AS72_Customized_TW_58.2.A.10.126/output/*.ext4 ~/android/system_dump/
- 將上述的
system.img
掛載至系統
mkdir system/
sudo mount -o ro system_a.ext4 system/
sudo mount -o ro vendor_a.ext4 system/vendor/
sudo mount -o ro odm_a.ext4 system/odm/
sudo mount -o ro product_a.ext4 system/product/
# 疑似不需要?sudo mount -o ro system_ext.img system/system_ext/
- 切換至
~/android/lineage/device/sony/pdx206/
,開始抽取專有驅動程式。
cd ~/android/lineage/device/sony/pdx206/
./extract-files.sh ~/android/system_dump/
抽取的檔案會自動放到
~/android/lineage/vendor/sony/
。取消掛載
system.img
並刪除無用檔案
sudo umount -R ~/android/system_dump/system/
rm -r ~/android/system_dump/
rm -r ~/XQ-AS72_Customized_TW_58.2.A.10.126
rm -r ~/super_image_dumper
5. 編譯Linux核心#
此步驟僅編譯Linux核心,要編譯完整ROM請直接跳下一節。
編譯後會自動打包成boot.img
,適合想開核心設定檔玩某些Android預設不給用的功能的用戶,例如超頻、
跑Docker,不需要重刷手機系統也能測試。
注意有些核心變動太多,編譯ROM時會不給過。
- 進入編譯環境。
cd ~/android/lineage/
source build/envsetup.sh
breakfast pdx206
- 欲修改核心設定檔,切換至
~/android/lineage/kernel/sony/sm8250/
目錄,並產生.config
設定檔
cd ~/android/lineage/kernel/sony/sm8250/
export ARCH=arm64
make pdx206_defconfig
- 進入核心設定檔選單,開始修改
make menuconfig
- 修改完成後,用
.config
取代原本的pdx206_defconfig
make savedefconfig
cp .config arch/arm64/configs/pdx206_defconfig
- 編譯核心
make clean
mka bootimage
輸出的
boot.img
位於~/android/lineage/out/target/product/pdx206/
。讓手機進入Fastboot Mode,使用fastboot指令將
boot.img
刷到手機。如果要Root權限記得將boot.img餵給Magisk將其修補後再刷一次。
fastboot flash boot boot.img
- 如果要重新編譯核心,請記得跑以下指令清理舊檔:
cd ~/android/lineage/kernel/sony/sm8250/
make clean
make mrproper
6. 編譯整個ROM#
編譯ROM前可以修改內建的APP之類的,或是改系統原始碼。
- 開始編譯ROM。
cd ~/android/lineage/
croot
make clean
brunch pdx206
這裡的指令下去,觀察一下跑個十分鐘,確認沒有輸出錯誤訊息後就可以去睡覺了。
編譯好的ROM
lineage-20.0-20230202-OFFICIAL-pdx206.zip
,位於~/android/lineage/out/target/product
。要開機進LineageOS的Recovery → Apply Updates from ADB刷入。
7. 後記#
本文最初寫於2023年2月3日,當初用Arch Linux編譯的,但後來換成Ubuntu了。整個編譯過程用虛擬機或Docker容器都可以。
根據 XDA的討論,LineageOS維護者突然中止維護,看來Xperia 5 II又得回去用unofficial build了。
儘管過去 Xperia 5 II刷LineageOS大致沒什麼問題,但我的Xperia 5 II已經 綠線發作,當成備用機了。