As of 2024-04-04, which is the time this article was written, Waydroid only provides LineageOS 18 container images based on Android 11. However, Waydroid is preparing LineageOS 20, which can be found on GitHub. However, it has not reached a fully functional level yet and there are still many issues, such as the inability to use libndk translation properly and the inability to run arm64 games.
LineageOS 20 vendor: https://github.com/waydroid/android_vendor_waydroid/tree/lineage-20
TIPS: If you encounter any errors during the build process, you may be able to find your problem in the Troubleshooting section.
Preparations#
I use an X86 platform running Arch Linux as the device for compiling LineageOS.
Compiling lineage-20 requires 32GB or more of RAM and around 300GB of disk space (although we may not need such a large space for building for Waydroid), as well as a network that can access GitHub (but you can also clone the LineageOS source code from a mirror site in China, which we will use later in this article).
Arch Linux needs to enable the multilib repository.
To fetch LineageOS source code, we need repo git
.
$ sudo pacman -Sy repo git
To build LineageOS, we need to install some build dependencies: 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
We also need to install OpenJDK 11 and Python 3, which are required for building LineageOS 20.
$ 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
Building LineageOS#
First, create a directory for building lineageos-20. Here, I will use ~/l20
as an example.
$ mkdir ~/l20
Configure git#
Since using repo
requires authentication to clone the lineage-20 repository, we need to configure git identity.
$ git config --global user.email "[email protected]"
$ git config --global user.name "Your Name"
Make sure git lfs is available.
$ git lfs install
Initialization#
Initialize the local repository:
$ repo init -u https://github.com/LineageOS/android.git -b lineage-20.0 --git-lfs
$ repo sync build/make
Get Waydroid local_manifests:
$ wget -O - https://raw.githubusercontent.com/waydroid/android_vendor_waydroid/lineage-20/manifest_scripts/generate-manifest.sh | bash
Sync#
Sync the source code. This may take more than an hour:
$ repo sync
Then configure the local build environment:
$ . build/envsetup.sh
Patching#
Apply Waydroid patches:
$ apply-waydroid-patches
Start building#
Waydroid AOSP lunch has the following options:
lineage_waydroid_arm-userdebug
lineage_waydroid_arm64-userdebug
lineage_waydroid_x86-userdebug
lineage_waydroid_x86_64-userdebug
Since I am using the X86_64 platform, I will use the lineage_waydroid_x86_64-userdebug
option.
Next, start the build process:
. build/envsetup.sh
lunch lineage_waydroid_x86_64-userdebug
make systemimage -j$(nproc --all)
make vendorimage -j$(nproc --all)
Note that -j$(nproc --all)
will use all your threads. If you encounter out-of-memory errors during compilation, it is recommended to use fewer threads.
This will be a long process. My platform is AMD Ryzen R5 7600X with 16GB of memory, and the first build takes about 3-4 hours.
By default, AOSP builds "Android Sparse Image" images, but we need raw filesystems (img) format images. Therefore, we need to convert the output images to the system.img
and vendor.img
that we need.
$ simg2img $OUT/system.img ~/system.img
$ simg2img $OUT/vendor.img ~/vendor.img
You can find the output images in your HOME directory.
Using the Custom Built Image#
We need to copy our custom images to /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
Then initialize Waydroid.
sudo waydroid init -f
Now we can use LineageOS 20 on Waydroid.
Here are some screenshots:
Troubleshooting#
Git-LFS not working properly#
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
If you encounter the above error during the build, first check if Git-LFS is installed and working properly in your environment.
$ git lfs install
Git LFS initialized.
If it doesn't return initialized
, you need to reinstall Git LFS and fetch the files that require Git-LFS from the source code again.
$ repo sync -c
$ repo forall -c 'git lfs pull'
You may also need to reapply Waydroid patches.
$ apply-waydroid-patches
During this process, there may be some patch conflicts. Simply sync the source code again.
$ repo sync
Try building again.
. build/envsetup.sh
lunch lineage_waydroid_x86_64-userdebug
make systemimage -j$(nproc --all)
make vendorimage -j$(nproc --all)
References#
https://docs.waydro.id/development/compile-waydroid-lineage-os-based-images
https://wiki.lineageos.org/emulator
This article is synchronized and updated to xLog by Mix Space.
The original link is https://blog.insnhgd.com/posts/code/2