快轉到主要內容

編譯修改第三方Android ROM & Kernel,以LineageOS 20 + Sony Xperia 5 II為例

智慧型手機 Root與刷機 Sony Xperia Android LineageOS Linux Kernel
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

因為想修改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。

  1. 從Google官網下載platform-tools。
wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
  1. 解壓縮到家目錄
unzip platform-tools-latest-linux.zip -d ~
  1. 用VIM編輯 ~/.profile,將platform-tools加入PATH
# add Android SDK platform tools to path
if [ -d "$HOME/platform-tools" ] ; then
    PATH="$HOME/platform-tools:$PATH"
fi
  1. 重新載入環境變數
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是用於同步儲存庫的工具。

  1. 將repo安裝至~/bin目錄:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
  1. 用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
  1. 重新載入環境變數
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. 同步儲存庫
#

  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
  1. 接下來讓repo sync自動下載LineageOS裝置的設定檔,這裡是pdx206。
source build/envsetup.sh
breakfast pdx206
repo sync -c -j8
  1. 沒抽取專有驅動程式會遇到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的指令稿才能抽出專有驅動程式。

  1. 透過 XperiFirm下載Xperia 5 II(pdx206)的韌體。Linux可以用Wine跑。

  2. 切換到韌體解壓縮的目錄,例如~/XQ-AS72_Customized_TW_58.2.A.10.126

cd ~/XQ-AS72_Customized_TW_58.2.A.10.126
  1. 下載 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
  1. 編譯 Super image tools工具,得到執行檔superunpack
cd ~
git clone https://github.com/munjeni/super_image_dumper.git
cd super_image_dumper
make
  1. 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
  1. 解出system_a.ext4(即system.img)、vender_a.ext4odm_a.ext4product_a.ext4
./superunpack /super_X-FLASH-ALL-2389.bin
  1. 建立工作目錄
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/
  1. 將上述的system.img掛載至系統
mkdir system/
sudo mount -o ro system_a.ext4 system/
sudo mount -o ro vender_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/
  1. 切換至~/android/lineage/device/sony/pdx206/,開始抽取專有驅動程式。
cd ~/android/lineage/device/sony/pdx206/
./extract-files.sh ~/android/system_dump/
  1. 抽取的檔案會自動放到~/android/lineage/vendor/sony/

  2. 取消掛載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時會不給過。

  1. 進入編譯環境。
cd ~/android/lineage/
source build/envsetup.sh
breakfast pdx206
  1. 欲修改核心設定檔,切換至~/android/lineage/kernel/sony/sm8250/目錄,並產生.config設定檔
cd ~/android/lineage/kernel/sony/sm8250/
export ARCH=arm64
make pdx206_defconfig
  1. 進入核心設定檔選單,開始修改
make menuconfig
  1. 修改完成後,用.config取代原本的pdx206_defconfig
make savedefconfig
cp .config arch/arm64/configs/pdx206_defconfig
  1. 編譯核心
make clean
mka bootimage
  1. 輸出的boot.img位於~/android/lineage/out/target/product/pdx206/

  2. 讓手機進入Fastboot Mode,使用fastboot指令將boot.img刷到手機。如果要Root權限記得將boot.img餵給Magisk將其修補後再刷一次。

fastboot flash boot boot.img
  1. 如果要重新編譯核心,請記得跑以下指令清理舊檔:
cd ~/android/lineage/kernel/sony/sm8250/
make clean
make mrproper

6. 編譯整個ROM
#

編譯ROM前可以修改內建的APP之類的,或是改系統原始碼。

  1. 開始編譯ROM。
cd ~/android/lineage/
croot
make clean
brunch pdx206
  1. 這裡的指令下去,觀察一下跑個十分鐘,確認沒有輸出錯誤訊息後就可以去睡覺了。

  2. 編譯好的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已經 綠線發作,當成備用機了。

參考資料
#

相關文章

給Sony Xperia 5 II刷機升上Android 13 (LineageOS 20)
智慧型手機 Root與刷機 Sony Xperia LineageOS Magisk
獨立編譯Android kernel(核心),以小米手機為例
智慧型手機 Root與刷機 Android Linux Kernel
[Root] Termux:以原生效能在Android手機上跑Docker (紅米Note 5)
智慧型手機 Root與刷機 Termux Android Linux Kernel Docker Xiaomi

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。