Tuan-Anh Tran
February 1, 2024

Roblox on Linux

Posted on February 1, 2024  •  4 minutes  • 643 words

I play game with my kid every now and then. His favorite game is Roblox. Unluckily, there’s no official Roblox client on Linux. So that leaves me with the only option of running emulation of one of the supported platform.

I’ve tried many ways and finally settled on Waydroid.

Bliss OS = 👎

Bliss OS with QEMU is the first option I tried. While it works and very simple to setup, the performance is abysmal, no matter how many CPU core I tried throwing at it.

There’s also a little problem with the mouse cursor’s position if you change resolution once the QEMU emulator already started.

Genymotion

I installed Genymotion and everything. The installation experience is very good, really easy to use.

However, Genymotion doesn’t offer aarch64 translation (only armv7 one) and Roblox is aarch64 app. But if you’re using one of the new Apple machine with M1, M2, … chips, then you can explore this option. I haven’t went that far because I do not own one.

Cloud gaming

Another option is go with cloud gaming. There are plenty options out there, something like boosteroid .

CloudBase has a list of which cloud gaming do support Roblox here . As of this post, only boosteroid does.

Make sure your games are supported and the latency is low enough (Most of them do have latency test for you to check before you subscribe).

Waydroid

Waydroid is a bit more complicated. It’s Wayland only so if you use Xorg, it’s out of the question. Actually, it’s not but it’s getting quite complicated. You will need to install waydroid like normal, run weston (a Wayland compositor) and then run waydroid show-full-ui command in there.

It also requires a custom kernel (linux-zen or you can compile yourself). I would recommend you to go with linux-zen if you’re using Arch or an Arch-variant since you don’t have to compile it yourself. Compiling kernel can take maybe 10-15 mins, depending on your computer’s specs.

The upside of using Waydroid is performance is much much better compared with BlissOS.

Installation is mostly smooth. I just need to follow the instruction on Waydroid page on Arch wiki but there are certain things that ain’t documented there.

Network doesn’t work

The script /usr/lib/waydroid/data/scripts/waydroid-net.sh prefers nft, iptables-legacy, iptables, in that order. There are 2 problems with that logic:

  • nftables doesn’t work in combination with iptables rules (which I have on due to Docker)
  • iptables-legacy doesn’t work at all
sudo sed -i~ -E 's/=.\$\(command -v (nft|ip6?tables-legacy).*/=/g' \
     /usr/lib/waydroid/data/scripts/waydroid-net.sh

The command above fixes it for me. Thanks rustyx .

Resolution

To set height & width, use the following command. Change your prefered resolution accordingly.

waydroid prop set persist.waydroid.width 2560
waydroid prop set persist.waydroid.height 1440

And restart waydroid (waydroid session stop)

Can’t install games/apps

By default, waydroid doesn’t come with ARM translation. There’s libndk or libhoudini. libndk is for AMD and libhoudini is for Intel. Or you can try both to see what works for you.

For example, in my case, libndk doesn’t work with Roblox but libhoudini does.

There’s this project call waydroid_script that help you with that.

This device isn’t Play Protect certified

Run sudo waydroid shell and then issue the following command

ANDROID_RUNTIME_ROOT=/apex/com.android.runtime ANDROID_DATA=/data ANDROID_TZDATA_ROOT=/apex/com.android.tzdata ANDROID_I18N_ROOT=/apex/com.android.i18n sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "select * from main where name = \"android_id\";"

Copy the number string and add it over at https://www.google.com/android/uncertified

This is also documented on Waydroid’s FAQ

Clipboard sharing

You need to have python-pyclip installed in order for clipboard sharing to work. I’m on Arch so what I need to do is

yay -S python-pyclip

Touch ain’t registered

You may need to enable fake_touch for this to work. Details here . The value should be a string, comma separated of all the apps id you want to enable this feature. If you want to do it for all apps, use *.

waydroid prop set persist.waydroid.fake_touch "*"
Follow me

Here's where I hang out in social media