Waydroid: Difference between revisions

imported>Yswtrue
add clipboard share discription
Onny (talk | contribs)
V4L2 camera forwarding: Simplify setup instructions
 
(40 intermediate revisions by 17 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.}}
{{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|Installing WayDroid on your system before running nixos-generate-config will create unnecessary fstab entries that may interfere with system functionality.}}


== Installation ==
== Installation ==


We will need to enable the WayDroid and LXD options (the WayDroid module enables LXC).
{{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:


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{ pkgs, ... }:
{
{
   virtualisation = {
   virtualisation.waydroid.enable = true;
    waydroid.enable = true;
  # Newer kernel versions may need
    lxd.enable = true;
  virtualisation.waydroid.package = pkgs.waydroid-nftables;
   };
 
   # Enable clipboard sharing
  environment.systemPackages = [ pkgs.wl-clipboard ];
}
}
</nowiki>}}
</nowiki>|name=|lang=}}


Apply changes
<syntaxhighlight lang="bash">
# Rebuild NixOS config.
nixos-rebuild switch
</syntaxhighlight>


You'll need to finish the WayDroid install in your shell.  
After rebuilding and switching, finish the Waydroid install in your shell.  


<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
# Fetch WayDroid images.
Fetch Waydroid images.
# You can add the parameters "-s GAPPS -f" to have GApps support.
You can add the parameters "-s GAPPS -f" to have GApps support.
sudo waydroid init
$ sudo waydroid init
</syntaxhighlight>
</syntaxhighlight>
How to certify a waydroid device for GAPPS[https://github.com/waydroid/waydroid/issues/379#issuecomment-1152526650]


Before the following steps, you might need to do some GPU adjustments. See the troubleshooting section.
Before the following steps, you might need to do some GPU adjustments. See the troubleshooting section.
Line 36: 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="bash">
<syntaxhighlight lang="console">
# Start the WayDroid LXC container
$ sudo systemctl start waydroid-container
sudo systemctl start waydroid-container
$ waydroid session start
# You'll know it worked by checking the journal You should see "Started Waydroid Container".
sudo journalctl -u waydroid-container
 
# Start WayDroid session
# You'll know it is finished when you see the message "Android with user 0 is ready".
waydroid session start
</syntaxhighlight>
</syntaxhighlight>


General usage
General usage


<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
# Start Android UI
Start Android UI
waydroid show-full-ui
$ waydroid show-full-ui
# List Android apps
 
waydroid app list
List Android apps
# Start an Android app
$ waydroid app list
waydroid app launch <application name>
 
# Install an Android app
Start an Android app
waydroid app install </path/to/app.apk>
$ waydroid app launch <application name>
# Enter the LXC shell
 
sudo waydroid shell
Install an Android app
# Overrides the full-ui width
$ waydroid app install </path/to/app.apk>
waydroid prop set persist.waydroid.width 608
 
Enter the LXC shell
$ sudo waydroid shell
 
Overrides the full-ui width
$ waydroid prop set persist.waydroid.width 608
</syntaxhighlight>
</syntaxhighlight>


Line 72: Line 70:
Use following command to upgrade Android (LineageOS) to a newer version if available
Use following command to upgrade Android (LineageOS) to a newer version if available


<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
sudo waydroid upgrade
$ sudo waydroid upgrade
</syntaxhighlight>
</syntaxhighlight>


Line 81: Line 79:




<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
# Stop Waydroid container
Stop Waydroid container
sudo systemctl stop waydroid-container
$ sudo systemctl stop waydroid-container


# Removing images and user data
Removing images and user data
sudo rm -r /var/lib/waydroid/* ~/.local/share/waydroid
$ sudo rm -r /var/lib/waydroid/* ~/.local/share/waydroid
</syntaxhighlight>
</syntaxhighlight>


== Troubleshooting ==
== 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 ===


=== GPU Adjustments ===
First enable ''geoclue2'' and ''adb'' daemon on the host<syntaxhighlight lang="nix">
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">
gsettings set org.gnome.system.location enabled true
</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
</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>


In case you have an NVIDIA card or an RX 6800 series, you'll need to disable GBM and mesa-drivers:
=== V4L2 camera forwarding ===
{{file|/var/lib/waydroid/waydroid_base.prop|prop|<nowiki>
ro.hardware.gralloc=default
ro.hardware.egl=swiftshader
</nowiki>}}


=== Linux 5.18+ ===
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


Linux 5.18 and later removed ashmem in favor of memfd, right now you need to tell waydroid (1.2.1 and later) to use the new module:
</syntaxhighlight>In case the graphical interface wont show up or the setup wizard fails you can do<syntaxhighlight lang="bash">
{{file|/var/lib/waydroid/waydroid_base.prop|prop|<nowiki>
waydroid shell -- am start -a android.intent.action.MAIN -c android.intent.category.HOME 
sys.use_memfd=true
waydroid shell -- pm disable-user --user 0 com.google.android.setupwizard
</nowiki>}}
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>.


=== Changing keyboard layout ===
=== Running applications that differ from the current host architecture via libhoudini or libndk<ref>Need help with activating libhoudini for waydroid on NixOS


According to [https://github.com/waydroid/waydroid/issues/209 an upstream issue], changing the keyboard layout doesn't seem possible at the moment.
https://www.reddit.com/r/NixOS/comments/15k2jxc/need_help_with_activating_libhoudini_for_waydroid/</ref> ===


=== Missing umlaute or UTF8 support ===
Run <code>nix shell github:nix-community/NUR#repos.ataraxiasjel.waydroid-script -c sudo waydroid-script</code>


According to [https://github.com/waydroid/waydroid/issues/536 an upstream issue] Android might fail to display special characters correctly.
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>


=== WayDroid interferes with suspend/hybernation ===
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])


According to [https://github.com/waydroid/waydroid/issues/168 an upstream issue] WayDroid might interfere with suspend or hybernation. You might have to stop the Android session and container to suspend your machine correctly.
== Troubleshooting ==


=== Clipboard share ===
=== GPU Adjustments ===


add `wl-clipboard` to `environment.systemPackages` and restart system, it should work now.
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]