InSnh-Gd

InSnh-Gd 的小空间

構建用於 Waydroid 的 LineageOS20 系統

截至 2024-04-04 也就是這篇文章撰寫的時間,Waydroid 最高只提供 LineageOS 18 容器鏡像,基於 Android 11,不過 Waydroid 正在準備 LineageOS 20,可以在 GitHub 上找到 LineageOS 20 但是目前還沒有達到完全可用的水平,還有很多問題,比如 libndk 轉譯似乎不能正常使用,arm64 遊戲無法運行。

LineageOS 20 vendor : https://github.com/waydroid/android_vendor_waydroid/tree/lineage-20

TIPS: 如果你在構建過程遇到錯誤,或許你可以在 錯誤排查 章節找到你的問題


預先準備#

我使用運行 Arch Linux 的 X86 平台作為編譯 LineageOS 的設備

編譯 lineage-20 需要 32GB 或更高的 RAM 以及 300GB 左右的硬碟空間(我們構建用於 Waydroid 的情況實際可能不會用到這麼大空間),以及一個可以訪問 GitHub 的網路(不過你用國內鏡像站克隆 LineageOS 源代碼也是可以的,後文我們會用到國內鏡像站)。

這裡 Arch Linux 需要開啟 multilib 倉庫

拉取 LineageOS 源代碼需要 repo git

$ sudo pacman -Sy repo git

構建 LineageOS 需要安裝一些構建時依賴:bc bison base_devel ccache curl flex git git-lfs gnupg gperf imagemagick readline lib32-zlib lib32-libelf lz4 lib32-sdl12-compat openssl libxml2 lzop pngcrush rsync schedtool squashfs-tools libxslt zip zlib

以及安裝我們構建 LineageOS 20 所需要的 OpenJDK 11 和 Python 3。

$ sudo pacman -Sy bc bison base_devel ccache curl flex git git-lfs gnupg gperf imagemagick readline lib32-zlib lib32-libelf lz4 lib32-sdl12-compat openssl libxml2 lzop pngcrush rsync schedtool squashfs-tools libxslt zip zlib jdk11-openjdk python

構建 LineageOS#

首先創建一個用於構建 lineageos-20 的目錄,這裡我以 ~/l20 為例。

$ mkdir ~/l20

配置 git#

因為使用 repo 需要驗證身份才能克隆 lineage-20 倉庫,所有我們需要配置 git 身份。

$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"

確保 git lfs 可用

$ git lfs install

初始化#

初始化本地倉庫:

$ repo init -u https://github.com/LineageOS/android.git -b lineage-20.0 --git-lfs
$ repo sync build/make

獲取 Waydroid local_manifests:

$ wget -O - https://raw.githubusercontent.com/waydroid/android_vendor_waydroid/lineage-20/manifest_scripts/generate-manifest.sh | bash

同步#

同步源代碼,這可能需要一個小時以上的時間:

$ repo sync

然後配置本地構建環境:

$ . build/envsetup.sh

補丁#

應用 Waydroid 補丁:

$ apply-waydroid-patches

開始構建#

Waydroid AOSP lunch 有以下選項:

lineage_waydroid_arm-userdebug
lineage_waydroid_arm64-userdebug
lineage_waydroid_x86-userdebug
lineage_waydroid_x86_64-userdebug

因為我使用的是 X86_64 平台,故使用 lineage_waydroid_x86_64-userdebug 選項。

接下來進行構建

. build/envsetup.sh
lunch lineage_waydroid_x86_64-userdebug
make systemimage -j$(nproc --all)
make vendorimage -j$(nproc --all)

注意-j$(nproc --all) 會使用你的所有線程,如果編譯時出現內存不足建議使用較少的線程。

這會是一個漫長的過程,我的平台是 AMD Ryzen R5 7600X + 16GB 內存的配置,第一次構建需要大概 3-4 小時。

構建 AOSP 默認輸出 “Android Sparse Image” 鏡像,但我們需要 raw filesystems (img) 格式的鏡像,故我們需要將輸出的鏡像轉換為我們所需要的 system.imgvendor.img

$ simg2img $OUT/system.img ~/system.img
$ simg2img $OUT/vendor.img ~/vendor.img

在 HOME 目錄即可找到輸出的鏡像。

使用構建的自定義鏡像#

我們需要把我們的自定義鏡像複製到 /usr/share/waydroid-extra/images/

$ sudo mkdir -p /usr/share/waydroid-extra/images
$ sudo cp ~/system.img /usr/share/waydroid-extra/images
$ sudo cp ~/vendor.img /usr/share/waydroid-extra/images

然後初始化 Waydroid

sudo waydroid init -f 

這樣我們就可以在 Waydroid 上使用 LineageOS 20 了~

上幾張截圖:
h7js.png

hNbv.png

hCvY.png

錯誤排查#

Git-LFS 未正常工作#

FAILED: Verifying uses-libraries: external/chromium-webview/prebuilt/arm64/webview.apk
Outputs: out/target/common/obj/APPS/webview_intermediates/enforce_uses_libraries.status
Error: exited with code: 1
Command: /bin/bash -c "(rm -f out/target/common/obj/APPS/webview_intermediates/enforce_uses_libraries.status ) && (build/soong/scripts/manifest_check.py --enforce-uses-libraries --enforce-uses-libraries-status out/target/common/obj/APPS/webview_intermediates/enforce_uses_libraries.status --aapt out/host/linux-x86/bin/aapt external/chromium-webview/prebuilt/arm64/webview.apk )"
Output:
zipro W 03-18 08:22:10 595921 595921] Error opening archive external/chromium-webview/prebuilt/arm64/webview.apk: Invalid file
ERROR: dump failed because no AndroidManifest.xml found
�[1;31merror:�[0m Command '['out/host/linux-x86/bin/aapt', 'dump', 'badging', 'external/chromium-webview/prebuilt/arm64/webview.apk']' returned non-zero exit status 1

如果構建中出現以上報錯,先檢查你的環境裡是否安裝 Git-LFS 或其是否正常安裝

$ git lfs install
Git LFS initialized.

如果沒有返回 initialized 則需要重新安裝 Git LFS 並再次拉取源代碼裡需要 Git-LFS 的文件。

$ repo sync -c
$ repo forall -c 'git lfs pull' 

可能還需要再重新應用 Waydroid 補丁。

$ apply-waydroid-patches

這個過程中可能會出現一些補丁衝突,重新同步一下源代碼即可。

$ repo sync

再次嘗試構建。

. build/envsetup.sh
lunch lineage_waydroid_x86_64-userdebug
make systemimage -j$(nproc --all)
make vendorimage -j$(nproc --all)

參考資料#

https://docs.waydro.id/development/compile-waydroid-lineage-os-based-images

https://wiki.lineageos.org/emulator

此文由 Mix Space 同步更新至 xLog
原始鏈接為 https://blog.insnhgd.com/posts/code/2


載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。