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 "*"