Waydroid: Difference between revisions

imported>PedroHLC
m Teach how to override width
Onny (talk | contribs)
V4L2 camera forwarding: Simplify setup instructions
 
(52 intermediate revisions by 22 users not shown)
Line 1: Line 1:
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].}}


== Install: ==
== 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=}}
 
 
After rebuilding and switching, finish the Waydroid install in your shell.
 
<syntaxhighlight lang="console">
Fetch Waydroid images.
You can add the parameters "-s GAPPS -f" to have GApps support.
$ sudo waydroid init
</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.
 
== Usage ==
 
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">
$ sudo systemctl start waydroid-container
$ waydroid session start
</syntaxhighlight>
 
General usage
 
<syntaxhighlight lang="console">
Start Android UI
$ waydroid show-full-ui
 
List Android apps
$ waydroid app list
 
Start an Android app
$ waydroid app launch <application name>
 
Install an Android app
$ waydroid app install </path/to/app.apk>
 
Enter the LXC shell
$ sudo waydroid shell
 
Overrides the full-ui width
$ waydroid prop set persist.waydroid.width 608
</syntaxhighlight>
 
== Maintenance  ==
 
=== Update Android ===
 
Use following command to upgrade Android (LineageOS) to a newer version if available
 
<syntaxhighlight lang="console">
$ sudo waydroid upgrade
</syntaxhighlight>
 
=== Resetting Android Container ===
 
{{Warning|All files of your Android container will be lost}}
 
 
<syntaxhighlight lang="console">
Stop Waydroid container
$ sudo systemctl stop waydroid-container
 
Removing images and user data
$ sudo rm -r /var/lib/waydroid/* ~/.local/share/waydroid
</syntaxhighlight>
 
== Tips and tricks ==
 
=== Mount host directories ===
 
Install and configure graphical application <code>waydroid-helper</code><syntaxhighlight lang="nix">
environment.systemPackages =  [ pkgs.waydroid-helper ];


You'll need to finish the WayDroid install in your shell.  
systemd = {
  packages = [ pkgs.waydroid-helper ];
  services.waydroid-mount.wantedBy = [ "multi-user.target" ];
};


<syntaxhighlight lang="bash">
</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">
# Rebuild NixOS config.
systemctl --user start waydroid-monitor
nixos-rebuild switch
</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.


# Fetch WayDroid images.
=== GPS/Location forwarding ===
# You can add the parameters "-s GAPPS -f" to have GApps support.
sudo waydroid init


# Before the following steps, you might need to do some GPU adjustments. See the next section.
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>


# Start the WayDroid LXC container
=== V4L2 camera forwarding ===
sudo systemctl start waydroid-container
# You'll know it worked by checking the journal You should see "Started Waydroid Container".
sudo journalctl -u waydroid-container


# Start WayDroid session
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">
# You'll know it is finished when you see the message "Android with user 0 is ready".
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
waydroid session start
</syntaxhighlight>


==GPU Adjustments==
</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:
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>
{{file|/var/lib/waydroid/waydroid_base.prop|prop|<nowiki>
Line 46: Line 158:
</nowiki>}}
</nowiki>}}


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


==See Also:==
* [https://wiki.archlinux.org/title/Waydroid Waydroid article on the Archlinux Wiki]
[https://wiki.archlinux.org/title/Waydroid Arch Wiki]