Software Engineer's Blog

Running KakaoTalk and WhatsApp on Linux: A Practical Waydroid Guide for Ubuntu/Kubuntu 25.10

Running KakaoTalk and WhatsApp on Linux: A Practical Waydroid Guide for Ubuntu/Kubuntu 25.10

If you’ve been a Linux user in Korea, you know the recurring pain: every couple of years you go searching for a way to run KakaoTalk, find a Wine-based guide, follow it, and a few months later it breaks. This time, I went down a different path — one that actually held up. Here’s what worked.

The Problem with Wine in 2026

The classic approach has been Wine + Bottles (or PlayOnLinux before it). It used to work. It doesn’t reliably work anymore, and here’s why: KakaoTalk’s recent versions ship with Themida, an anti-debugging and code obfuscation layer. Themida treats Wine as a suspicious environment and refuses to let the app run, throwing errors like:

An Error has occurred while loading imports. Wrong DLL present.

You can chase this down a rabbit hole: switching Wine runners, downgrading to old 32-bit KakaoTalk binaries from sketchy archive sites, blocking auto-update with hosts file tricks. But every Kakao security update breaks your setup again. For an app that handles personal messages, authentication tokens, and KakaoPay integration, running an old, third-party-sourced binary is a real security risk, not just an inconvenience.

I tried Bottles. It installed. Themida killed it on first launch. So I changed strategy.

Why Waydroid Won

The alternatives I considered:

ApproachMemoryStabilityKorean InputVerdict
Wine + Bottles~500MBBreaks on every Kakao updatePainfulSkip
Windows VM (KVM)4GB+ExcellentNativeOverkill for one app
Waydroid~1GBExcellent (official Android support)Native (Android IME)Winner

Waydroid runs Android in an LXC container — not a virtual machine. It shares the host Linux kernel directly, so the overhead is closer to Docker than to QEMU. You get the official Android KakaoTalk app, which Kakao actually maintains and tests. No more Themida battles.

Prerequisites

This guide is for Ubuntu 25.10 or Kubuntu 25.10 (Plucky Puffin / Questing Quokka). Earlier LTS versions also work with minor adjustments.

You need:

  1. No active firewall blocking forwarding (we’ll deal with Docker conflicts later).

Kernel binder module. Modern Ubuntu kernels include it but don’t auto-load:

find /lib/modules/$(uname -r) -name "*binder*"

If a .ko.zst file shows up, you’re good.

A Wayland session. Waydroid runs on Wayland; X11 sessions need a workaround that’s not worth the trouble. Verify:

echo $XDG_SESSION_TYPE

Should output wayland. If it’s x11, log out and select “Plasma (Wayland)” or “Ubuntu on Wayland” at the login screen.

Installation

Step 1: Load the binder module

sudo modprobe binder_linux
sudo mkdir -p /dev/binderfs
sudo mount -t binder binder /dev/binderfs
ls /dev/binderfs

You should see binder-control and features. Make this persistent:

echo "binder_linux" | sudo tee /etc/modules-load.d/waydroid.conf

Step 2: Install Waydroid

sudo apt update
sudo apt install curl ca-certificates -y
curl -s https://repo.waydro.id | sudo bash
sudo apt install waydroid -y

The curl | bash line adds the Waydroid APT repository. If you prefer to inspect it first (recommended for production work), download the script and read it before running.

Step 3: Initialize with Google Apps

KakaoTalk needs Google Play Services. Initialize Waydroid with the GAPPS image:

sudo waydroid init -s GAPPS

This downloads about 1.4GB (LineageOS 20 / Android 13 system image plus vendor image). Coffee break.

Step 4: Start the container

sudo systemctl enable --now waydroid-container
waydroid session start

Leave that terminal running. Open a new one and:

waydroid show-full-ui

The Android home screen should appear within 30 seconds.

The Tricky Part: Google Play Certification

If you open Play Store now and try to sign in, Google will reject your “device” because the Waydroid LineageOS image isn’t certified. You need to register your virtual device’s Android ID with Google manually.

Step 1: Boot Play Store once

In the Waydroid Android UI, tap Play Store. Don’t sign in yet — this step just causes Google Play Services to initialize and generate an Android ID.

You’ll likely see “updating Google apps” for a minute or two. Wait for it to settle.

Step 2: Extract the Android ID

From your host terminal:

sudo waydroid shell

Inside the Android shell:

sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \
  "select * from main where name = \"android_id\";"

You should see something like android_id|3522499779533048176. Copy that number.

If the result is empty, your Android instance hasn’t reached the internet yet. See the network troubleshooting section below.

Step 3: Register with Google

In your host browser (not Waydroid’s), go to:

https://www.google.com/android/uncertified

Sign in with the Google account you’ll use, paste the Android ID, click Register.

Step 4: Clear caches and restart

In Waydroid Settings → Apps → See all apps:

  • Google Play Services → Storage → Clear storage + Clear cache
  • Google Play Store → Storage → Clear storage + Clear cache

Then restart the session:

waydroid session stop
waydroid session start

Wait 5–10 minutes for Google’s servers to propagate the registration. Then sign in to Play Store. If your account uses passkeys, click “Try another way” (Waydroid doesn’t have a fingerprint sensor).

Network Troubleshooting: The Docker Trap

If you can’t ping anything from inside Waydroid, Docker is the most likely culprit. Docker’s iptables rules set the FORWARD chain default policy to DROP, which kills Waydroid’s container traffic.

Diagnose:

sudo iptables -L FORWARD -n | head -5

If you see Chain FORWARD (policy DROP) and Docker chains, fix it:

sudo systemctl stop docker docker.socket
sudo ip link delete docker0 2>/dev/null
sudo iptables -F FORWARD
sudo iptables -P FORWARD ACCEPT
waydroid session stop
sudo systemctl restart waydroid-container
sleep 3
waydroid session start

This isn’t a permanent fix. Every time Docker starts, it’ll re-add its rules. For Docker users, the long-term solution is to add "iptables": false to /etc/docker/daemon.json and manage forwarding manually, or to use Podman instead. For occasional Docker users, just stopping it before launching Waydroid works.

ARM Compatibility for KakaoTalk

Here’s a curveball: KakaoTalk only ships ARM binaries, not x86_64. Same for many Korean and Japanese apps. Without an ARM-to-x86 translation layer, Play Store will show “This app won’t work for your device”.

The fix is libhoudini, Intel’s ARM translation library. There’s a community script that handles installation:

cd ~/Downloads
git clone https://github.com/casualsnek/waydroid_script.git
cd waydroid_script
sudo apt install python3-venv -y
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
sudo venv/bin/python3 main.py

In the interactive menu:

  1. Select Android 13
  2. Select Install
  3. Use Space to check libhoudini, then Enter

Restart the container:

waydroid session stop
sudo systemctl restart waydroid-container
sleep 3
waydroid session start

KakaoTalk should now show as installable in Play Store. WhatsApp doesn’t need this. It has native x86_64 builds.

Installing the Apps

With libhoudini installed, Play Store will now show both apps as installable. Search KakaoTalk (or 카카오톡) and WhatsApp, install, done.

WhatsApp ships native x86_64 builds and would have worked without libhoudini, but having ARM translation in place means you can install just about any Android app that catches your eye later.

For both apps, don’t replace your phone’s primary session. Use the multi-device feature:

  • KakaoTalk: Phone → More → Settings → Account → Connect Other Devices → use QR or ID/password from Waydroid
  • WhatsApp: Phone → Settings → Linked Devices → Link a Device → scan QR from Waydroid

This way the desktop instance stays in sync with your phone.

Korean Input Setup

Install Gboard from Play Store. In Settings → System → Languages & input:

  1. On-screen keyboardManage on-screen keyboards → toggle Gboard ON
  2. Default keyboard → select Gboard
  3. In Gboard, add Korean as a language

For physical keyboard hangul/english toggle with Shift+Space (the convention Korean Linux/Windows users are used to), there’s a small trick:

  1. Settings → System → Languages & input → Physical keyboard
  2. Tap the listed keyboard (e.g. wayland_keyboard)
  3. Add English (US) layout — and only English

With Gboard handling Korean at the IME layer and the physical keyboard layout staying English-only, Shift+Space triggers the IME’s hangul/english toggle natively. No extra apps needed.

Daily Usage

Enable auto-start at boot (the container itself only takes ~18MB idle):

sudo systemctl enable waydroid-container

Launch the Android UI:

waydroid show-full-ui

From there, tap KakaoTalk or WhatsApp like you would on a phone. KRunner (Alt+Space) also finds installed Android apps by name once Waydroid registers their .desktop entries under ~/.local/share/applications/.

Free memory when done:

waydroid session stop

That’s it. The session restarts automatically next time you launch an app.

Resource Footprint

On my setup (Ubuntu 25.10, kernel 6.17, x86_64):

  • Container idle: ~20MB
  • Session running, KakaoTalk open: ~1GB
  • CPU at idle: 1–3%
  • App launch time: 5–10 seconds (first time after session start)

Compared to a Windows VM (4GB+) or BlueStacks (3GB+), this is much lighter. Compared to Wine (~500MB), it’s heavier. But Wine breaks every few months. Worth the tradeoff.

Troubleshooting Reference

SymptomLikely causeFix
connect: Network is unreachableDocker iptables conflictStop Docker, flush FORWARD chain
Empty android_id in gservices.dbPlay Services hasn’t initializedOpen Play Store once, wait, retry
”App won’t work for your device”Missing ARM translationInstall libhoudini
Passkey verification loopWaydroid lacks biometrics”Try another way” → password
Auto-start fails after rebootBinder module not persistentAdd to /etc/modules-load.d/
waydroidplatform service errorsContainer not actually runningsudo systemctl restart waydroid-container

Closing Thoughts

The whole journey, from “let me try Bottles” to a stable KakaoTalk install, took me about three hours of trial and error. Most of that was the Themida wall, the Docker network conflict, and the libhoudini ARM translation puzzle. Hopefully this saves you most of that.

A few things that surprised me:

  • Updates aren’t scary anymore. When KakaoTalk pushes a new version, Play Store handles it. No more dreading every release.
  • The same approach works for any Android-only app: Korean banking apps, regional services, even apps that gate themselves to mobile-only. They run.
  • Multi-device login means the desktop instance is ephemeral. If something goes wrong, I can wipe the Waydroid container and reconnect from my phone in two minutes.

This setup will probably need tweaking down the line. Waydroid is actively developed, and Android image versions will keep advancing. But the architecture (LXC container, GAPPS image, libhoudini for ARM) is stable enough that this guide should hold for a while.

If you hit something this guide doesn’t cover, the Waydroid documentation and the waydroid_script repo are the two places I kept returning to.

Good luck.