构建用于 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

Copy
$ 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。

Copy
$ 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 为例。

Copy
$ mkdir ~/l20

配置 git

因为使用 repo 需要验证身份才能克隆 lineage-20 仓库，所有我们需要配置 git 身份。

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

确保 git lfs 可用

Copy
$ git lfs install

初始化

初始化本地仓库：

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

获取 Waydroid local_manifests：

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

同步

同步源代码，这可能需要一个小时以上的时间：

Copy
$ repo sync

然后配置本地构建环境：

Copy
$ . build/envsetup.sh

补丁

应用 Waydroid 补丁：

Copy
$ apply-waydroid-patches

开始构建

Waydroid AOSP lunch 有以下选项：

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

因为我使用的是 X86_64 平台，故使用 lineage_waydroid_x86_64-userdebug 选项。

接下来进行构建

Copy
. 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.img 和 vendor.img。

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

在 HOME 目录即可找到输出的镜像。

使用构建的自定义镜像

我们需要把我们的自定义镜像复制到 /usr/share/waydroid-extra/images/

Copy
$ 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

Copy
sudo waydroid init -f

这样我们就可以在 Waydroid 上使用 LineageOS 20 了～

上几张截图：

错误排查

Git-LFS 未正常工作

Copy
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 或其是否正常安装

Copy
$ git lfs install
Git LFS initialized.

如果没有返回 initialized 则需要重新安装 Git LFS 并再次拉取源代码里需要 Git-LFS 的文件。

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

可能还需要再重新应用 Waydroid 补丁。

Copy
$ apply-waydroid-patches

这个过程中可能会出现一些补丁冲突，重新同步一下源代码即可。

Copy
$ repo sync

再次尝试构建。

Copy
. 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