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

因為想修改Linux核心設定檔(kernel config),所以學習如何編譯LineageOS ROM。參考LineageOS Wiki和XDA教學後編譯後,遂將過程記敘於此。

這篇不是LineageOS移植教學,而是修改現有的LineageOS ROM原始碼並重新編譯。可視需求只編譯核心(刷核心/內核),或是整個ROM重新編譯。

Sony Xpria 5 II (pdx206) 目前的LineageOS支援狀態是Official。因其運作良好,要自行編譯修改也不是難事。

1. 前置作業

目標裝置Xperia 5 II必須已解鎖bootloader,為方便測試已刷成LineageOS 20,下文一律以pdx206稱呼之。

編譯ROM需要一台x86架構64位元Linux系統的電腦,官方建議是Ubuntu。除非你像我一樣不怕死才用Arch Linux。

下載LineageOS原始碼需要約50~100GB的硬碟空間,編譯ROM需要準備至少250GB的硬碟空間,且最好是SSD。

編譯RAM至少需要16GB,不然SWAP就得給大一點。

視網路速度,下載約需要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。

  2. 解壓縮

1
unzip platform-tools-latest-linux.zip -d ~
  1. 用VIM編輯 ~/.profile,將platform-tools加入PATH
1
2
3
4
# add Android SDK platform tools to path
if [ -d "$HOME/platform-tools" ] ; then
    PATH="$HOME/platform-tools:$PATH"
fi
  1. 重新載入環境變數
1
source ~/.profile

2.2. 安裝編譯依賴套件

  1. Arch Linux要先啟用multilib才能裝32位元套件。

  2. 更新所有套件,更新期間會自動裝各套件的32位元版本。

1
sudo pacman -Syu
  1. 接著安裝以下套件。有些需要從AUR裝舊版的,例如ncurses5sdl
1
2
3
4
sudo pacman -S bc bison base-devel ccache curl flex gcc git gnupg gperf imagemagick ncurses lib32-readline lib32-zlib libelf lz4 android-tools
sdl2 opensll libxml2 lzop pngcrush rsync  schedtool squashfs-tools libxslt zip zlib libxcrypt libxcrypt-compat

yay -S ncurses5-compat-libs sdl

2.3. 安裝Java

Arch Linux最新的Java版本是OpenJDK 19。舊版LineageOS可能需要更舊版的JDK。

安裝OpenJDK:

1
sudo pacman -S jdk-openjdk

2.4. 安裝Python

Arch Linux最新Python版本是3.10.9。有需要舊版可用AUR裝

安裝Python:

1
sudo pacman -S python3

2.5. 建立工作目錄

建立存放工具和Android原始碼的目錄,不要有中文。

1
2
mkdir -p ~/bin
mkdir -p ~/android/lineage

2.6. 安裝repo工具

repo是用於同步儲存庫的工具。

  1. 安裝至~/bin目錄:
1
2
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
  1. 用VIM編輯~/.profile,將bin目錄加入PATH:
1
2
3
4
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
  1. 重新載入環境變數
1
source ~/.profile

2.7. 設定git資訊

設定Git的聯絡資訊

1
2
git config --global user.email "電郵"
git config --global user.name "名字"

3. 設定ccache

選擇性步驟。如果要多次編譯ROM,設定ccache能節省下次編譯的時間,但是會佔用更多硬碟空間。

啟用CCACHE,並分配50GB硬碟作為快取空間

1
2
3
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
ccache -M 50G

4. 下載原始碼與裝置設定檔

4.1. 同步儲存庫

  1. 同步LineageOS的原始碼儲存庫,選擇lineage-20的分支
1
2
3
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裝置的設定檔。
1
2
3
source build/envsetup.sh
breakfast pdx206
repo sync -c -j8
2023年2月,pdx206已正式進入LineageOS官方儲存庫。此處為unofficial時期的舊資訊。

pdx206尚未進入LineageOS官方儲存庫,狀態是unofficial,這裡需要手動修改要下載的儲存庫。

編輯~/android/lineage/.repo/local_manifests/roomservice.xml,指定下載kyasu的pdx206儲存庫,核心是跟pdx203共用sm8250所以不用改。

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <project path="device/sony/pdx206" remote="github" name="kyasu/android_device_sony_pdx206" revision="lineage-20" />
  <project path="device/sony/sm8250-common" remote="github" name="LineageOS/android_device_sony_sm8250-common" revision="lineage-20" />
  <project path="hardware/sony" remote="github" name="LineageOS/android_hardware_sony" revision="lineage-20" />
  <project path="kernel/sony/sm8250" remote="github" name="LineageOS/android_kernel_sony_sm8250" revision="lineage-20" />
</manifest>

下載pdx206的專有vendor,將目錄命名為pdx206,並放到~/android/lineage/vendor/sony/目錄。

接著再同步儲存庫一次

1
2
3
4
source build/envsetup.sh
lunch
# 選取pdx206-userdebug
repo sync -c -j8

4.2. 抽取專有驅動程式

參考LineageOS Wiki瞭解如何抽取專有驅動程式(proprietary blobs)。

  1. 專有驅動程式可以從刷機包、OTA包、實體機抽取,我是從pdx206刷機包抽取。解壓縮得到payload.bin

  2. system-dumper-go解開payload.bin,會得到system.imgboot.img等系統映像檔:

1
./payload-dumper-go payload.bin
  1. system.img掛載至系統
1
2
3
4
5
6
7
8
9
mkdir ~/android/system_dump/
cd ~/android/system_dump/
# 將payload.bin抽取出來的檔案放到此目錄
mkdir system/
sudo mount -o ro system.img system/
sudo mount -o ro vendor.img system/vendor/
sudo mount -o ro odm.img system/odm/
sudo mount -o ro product.img system/product/
sudo mount -o ro system_ext.img system/system_ext/
  1. 切換至~/android/lineage/device/sony/pdx206/,開始抽取專有驅動程式。
1
./extract-files.sh ~/android/system_dump/
  1. 抽取的檔案會自動放到~/android/lineage/vendor/sony/

  2. 取消掛載system.img並刪除無用檔案

1
2
sudo umount -R ~/android/system_dump/system/
rm -rf ~/android/system_dump/

4.3. 編譯Linux核心

此步驟僅編譯Linux核心,並會自動打包成boot.img,適合想開核心設定檔玩某些Android預設不給用的功能的用戶,例如超頻、跑Docker,不需要重刷手機系統也能測試。

注意有些核心變動編譯ROM時會不給過。

要編譯完整ROM請直接跳下一節。

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

  2. 使用fastboot將其刷到手機。如果要Root權限記得餵給Magisk將其修補後再刷一次。

1
fastboot flash boot boot.img

4.4. 編譯整個ROM

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

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

  2. 編譯好的ROM lineage-20.0-20230202-UNOFFICIAL-pdx206.zip,位於~/android/lineage/out/target/product。要開機進LineageOS的Recovery → Apply Updates from ADB刷入。

參考資料


感謝您的閱讀。歡迎分享Ivon的部落格(ivonblog.com)的文章,引用或轉載請註明文章網址,並遵守創用CC-姓名標示-非商業性-禁止改作 4.0 國際授權條款。如需商業使用請來信告之。

written by human, not by AI

如果本網站文章對您有幫助,歡迎請我喝杯珍珠奶茶。

留言板

點選按鈕,選擇您覺得方便的留言系統。要討論程式碼請用Giscus,匿名討論請用Disqus。

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

這是Disqus留言板,您可能會看到Disqus投放的廣告。無論有無登入皆可留言。此處留言只有本站參與者看得到。若您選擇以訪客身份匿名留言,就不會收到後續回覆通知。