Waydroid: Difference between revisions
Add section for GPS/location sharing |
→V4L2 camera forwarding: Simplify setup instructions |
||
| (30 intermediate revisions by 10 users not shown) | |||
| Line 1: | Line 1: | ||
[https://waydro.id Waydroid] is an application which uses LXC containers to run Android applications on a non-Android system. | [https://waydro.id Waydroid] is an application which uses LXC containers to run Android applications on a non-Android system. | ||
{{Warning|Waydroid requires a Wayland desktop session and cannot be used on X11 directly, but can be run in a nested Wayland session, using e.g. [https://www.hjdskes.nl/projects/cage cage] | {{Warning|Waydroid requires a [[Wayland]] desktop session and cannot be used on X11 directly, but can be run in a nested [[Wayland]] session, using e.g. [https://www.hjdskes.nl/projects/cage cage].}} | ||
== Installation == | == Installation == | ||
{{Warning|Installing Waydroid on your system before running nixos-generate-config will create unnecessary fstab entries that may interfere with system functionality.}} | |||
Enable Waydroid in your system configuration: | Enable Waydroid in your system configuration: | ||
| Line 11: | Line 12: | ||
{ | { | ||
virtualisation.waydroid.enable = true; | virtualisation.waydroid.enable = true; | ||
# Newer kernel versions may need | |||
virtualisation.waydroid.package = pkgs.waydroid-nftables; | |||
# Enable clipboard sharing | |||
environment.systemPackages = [ pkgs.wl-clipboard ]; | |||
} | } | ||
</nowiki>}} | </nowiki>|name=|lang=}} | ||
| Line 29: | Line 35: | ||
== Usage == | == Usage == | ||
Start the container | Start the container and userspace Wayland session. You'll know it is finished when you see the message "Android with user 0 is ready". | ||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
$ sudo systemctl start waydroid-container | $ sudo systemctl start waydroid-container | ||
$ waydroid session start | $ waydroid session start | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Line 64: | Line 63: | ||
$ waydroid prop set persist.waydroid.width 608 | $ waydroid prop set persist.waydroid.width 608 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Maintenance == | == Maintenance == | ||
| Line 100: | Line 88: | ||
== Tips and tricks == | == Tips and tricks == | ||
=== Mount host directories === | |||
Install and configure graphical application <code>waydroid-helper</code><syntaxhighlight lang="nix"> | |||
environment.systemPackages = [ pkgs.waydroid-helper ]; | |||
systemd = { | |||
packages = [ pkgs.waydroid-helper ]; | |||
services.waydroid-mount.wantedBy = [ "multi-user.target" ]; | |||
}; | |||
</syntaxhighlight>Enable the user service which is also required. Note that this is not persistent and needs to get started after reboot again.<syntaxhighlight lang="bash"> | |||
systemctl --user start waydroid-monitor | |||
</syntaxhighlight>Now start <code>waydroid-helper</code> application and add a shared directory. As an example, source directory could be <code>/home/myuser/Public</code> and target directory <code>/home/myuser/.local/share/waydroid/data/media/0/NixOS</code>. Ensure that both directories already exist locally. After that you might need to restart the ''Waydroid'' container which is also possible with the graphical user interface. | |||
=== GPS/Location forwarding === | === GPS/Location forwarding === | ||
First enable ''geoclue2'' daemon on the host<syntaxhighlight lang="nix"> | |||
First enable ''geoclue2'' and ''adb'' daemon on the host<syntaxhighlight lang="nix"> | |||
services.geoclue2.enable = true; | services.geoclue2.enable = true; | ||
programs.adb.enable = true; | |||
</syntaxhighlight>Enable location provider in your desktop environment. For Gnome Shell you can do this<syntaxhighlight lang="bash"> | </syntaxhighlight>Enable location provider in your desktop environment. For Gnome Shell you can do this<syntaxhighlight lang="bash"> | ||
gsettings set org.gnome.system.location enabled true | gsettings set org.gnome.system.location enabled true | ||
</syntaxhighlight>To test and see location<syntaxhighlight lang="bash"> | </syntaxhighlight>To test and see location<syntaxhighlight lang="bash"> | ||
nix shell nixpkgs#geoclue2 -c $(nix eval --raw nixpkgs#geoclue2)/libexec/geoclue-2.0/demos/where-am-i | nix shell nixpkgs#geoclue2 -c $(nix eval --raw nixpkgs#geoclue2)/libexec/geoclue-2.0/demos/where-am-i | ||
</syntaxhighlight>Get IP address of the Waydroid guest and connect ''adb'' to it<syntaxhighlight lang="bash"> | |||
waydroid shell ip addr show | |||
adb connect <IP>:5555 | |||
</syntaxhighlight>Download, initialize and run geobridge script<syntaxhighlight lang="bash"> | |||
wget https://gitlab.com/papiris/geobridge/-/raw/main/geobridge.sh | |||
sh geobridge.sh --init | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== | === V4L2 camera forwarding === | ||
Camera forwarding using V4L2 is broken on upstream, but can be achieved by using the Waydroid images of the [https://github.com/WayDroid-ATV Waydroid-ATV project]. You might [[Waydroid#Resetting Android Container|need to reset]] your existing Waydroid environment. Then stop the container and fetch the latest Waydroid-ATV images.<syntaxhighlight lang="bash"> | |||
systemctl stop waydroid-container | |||
waydroid init -f \ | |||
-c https://waydroid-atv.github.io/ota/a16-qpr2/system \ | |||
-v https://waydroid-atv.github.io/ota/a16-qpr2/vendor \ | |||
-r lineage \ | |||
-s GAPPS | |||
systemctl start waydroid-container | |||
waydroid session start | |||
</syntaxhighlight>In case the graphical interface wont show up or the setup wizard fails you can do<syntaxhighlight lang="bash"> | |||
waydroid shell -- am start -a android.intent.action.MAIN -c android.intent.category.HOME | |||
waydroid shell -- pm disable-user --user 0 com.google.android.setupwizard | |||
</ | waydroid shell -- pm disable-user --user 0 com.google.android.gms.setup | ||
</syntaxhighlight>In case the camera access will crash the Waydroid container, there's a recent image which solves this on AMD GPUs. Download it and extract the contents to <code>/etc/waydroid-extra/images</code>. After that recreate the environment as mentioned above but only issue <code>waydroid init -f</code>. | |||
=== | === Running applications that differ from the current host architecture via libhoudini or libndk<ref>Need help with activating libhoudini for waydroid on NixOS | ||
https://www.reddit.com/r/NixOS/comments/15k2jxc/need_help_with_activating_libhoudini_for_waydroid/</ref> === | |||
Run <code>nix shell github:nix-community/NUR#repos.ataraxiasjel.waydroid-script -c sudo waydroid-script</code> | |||
Or, alternatively, add <code>nur.repos.ataraxiasjel.waydroid-script</code> from the NUR to your flake or shell or NixOS <code>environment.systemPackages</code>, or HM <code>home.packages</code> or something like that based on [https://github.com/nix-community/NUR readme] and run <code>sudo waydroid-script</code> | |||
In the TUI, select Android 13 > Install > libhoudini (or libndk, [https://github.com/casualsnek/waydroid_script/blob/fcb15624db0811615ea9800837a836c4777674bf/README.md#install-libndk-arm-translation which script author claims may be faster on AMD]) | |||
== Troubleshooting == | |||
=== | === GPU Adjustments === | ||
In case you have an NVIDIA card or an RX 6800 series, you'll need to disable GBM and mesa-drivers: | |||
{{file|/var/lib/waydroid/waydroid_base.prop|prop|<nowiki> | |||
ro.hardware.gralloc=default | |||
ro.hardware.egl=swiftshader | |||
</nowiki>}} | |||
==See Also:== | ==See Also:== | ||
* [https://wiki.archlinux.org/title/Waydroid Waydroid article on the Archlinux Wiki] | * [https://wiki.archlinux.org/title/Waydroid Waydroid article on the Archlinux Wiki] | ||