-
Notifications
You must be signed in to change notification settings - Fork 0
Zomdroid Support and Installation
This guide covers installing and running Project Zomboid Optimiser (PZO) on Android devices using Zomdroid, the open-source Linux translation launcher for Project Zomboid (Build 42 & Build 41).
Zomdroid is an unofficial community launcher that allows you to play the PC version of Project Zomboid on 64-bit Android smartphones and tablets.
Unlike traditional emulators (such as Winlator or Mobox) which emulate the Windows API and DirectX, Zomdroid utilizes lightweight Linux containerization and box64 translation to run the native Linux PC build of Project Zomboid directly on Android hardware.
Important
Prerequisites for Zomdroid:
- You must own a legitimate copy of Project Zomboid on Steam or GOG. Zomdroid does not provide game files and does not condone piracy.
- You need the Linux PC version of the game files (downloaded via Steam on PC or via
DepotDownloaderin Termux). - Android 11+ with a 64-bit ARM processor (ARM64 / AArch64). Snapdragon devices with Adreno GPUs (using Turnip drivers) provide the highest compatibility, smoothest performance, and avoid GL4ES shader include limitations.
Mobile devices face severe constraints that desktop PCs do not: thermal throttling, battery drain, and aggressive Android Low Memory Killer (LMK) daemons.
Stock Project Zomboid generates heavy memory churn, unoptimized full-screen fog fillrate math, and linear line-of-sight loops that can cause mobile phones to overheat and drop to single-digit framerates. PZO directly tackles these bottlenecks:
-
Single-Pass Quarter-Resolution Fog (
FogQuarterBufferGovernor):- Stock draws weather fog across 50–100+ separate draw calls across the screen buffer.
- PZO batches fog into a single GPU draw call at 25% fragment fill rate with bilinear filtering, cutting 75% of GPU fragment math. This drastically reduces mobile GPU heat and power consumption.
-
Immediate Chunk Streamer Dispatch (
StreamerWake):- Unparks the chunk loading streamer immediately, reducing mobile stutter when exploring the map or driving.
-
$O(1)$ Line-of-Sight Visibility Caching (PlayerLosOptimizer):- Replaces expensive
$O(N)$ linear scans with thread-local hash lookups during zombie encounters.
- Replaces expensive
-
Blood Decal & Audio Concurrency Capping (Lua Mod):
- Limits cumulative blood decals and limits overlapping zombie audio voices, preventing mobile audio DSP buffer underruns (crackling) and VRAM exhaustion.
-
Low-Latency Garbage Collection Tuning:
- Reduces stop-the-world GC pauses on mobile CPU cores.
PZO is engineered to run seamlessly across PC, server, and translated mobile environments:
| PZO Component | Zomdroid Compatibility | Behavior on Mobile |
|---|---|---|
| PZO Steam Workshop Mod (Item 3787481250) | 100% Native | Executes inside the game's internal Kahlua Lua VM without translation overhead. Controls blood decals, corpse sweeps, and audio throttling. (See note below regarding Build 41 GL4ES shaders). |
PZO Java Engine (PZOptimEngine.jar) |
Native Java Agent | Runs directly on the OpenJDK runtime inside the Zomdroid Linux environment via -javaagent:PZOptimEngine.jar. Powers bytecode runtime transformations (fog optimization, LOS caching, chunk streaming). |
| Agent / Entrypoint Mode | Bytecode Agent Mode | Zomdroid starts the game using its own custom Android launcher class, so launching via PZOEntrypoint is not used. However, all bytecode optimizations and the Lua bridge run fully via the Java agent (-javaagent). |
Native SIMD Library (libpzo_native64.so) |
Pure Java Fallback | Compiled for desktop x86_64 with glibc and AVX2. Because Android uses ARM64, this library cannot load on Android. PZO's built-in safety guard detects this and automatically falls back to 100% pure Java. You do not need to install libpzo_native64.so. |
| Persistent VBOs | Automatic Fallback | If the mobile GPU driver does not expose desktop OpenGL 4.4 GL_ARB_buffer_storage, PZO dynamically reverts to standard streaming vertex buffers. |
Warning
Build 41 Shaders on the GL4ES Renderer:
On Build 41 when using the GL4ES renderer, the workshop mod's replacement shaders with #include directives fail to compile because GL4ES does not expand include utilities (rgb2hsv, hueShift, puddlesMain, performPaddedBodyMask). This causes vehicle, puddle, and tree programs to fail to link.
Recommendations:
- On Snapdragon (Adreno) devices, select the Turnip (Vulkan) renderer in Zomdroid settings instead of GL4ES.
- If you must use GL4ES on Build 41, avoid activating the mod's replacement shaders (or use vanilla shaders) to prevent missing vehicle textures.
Caution
-
DO NOT edit
ProjectZomboid64.json: Zomdroid does not readProjectZomboid64.json. - DO NOT change or override the classpath: Zomdroid constructs its own internal classpath for Android/box64 containerization. Overriding the classpath replaces Zomdroid's configuration and the game will not start.
-
Configure all JVM arguments in Zomdroid's Launcher UI: JVM arguments (such as
-javaagentand-Xmx) must be entered directly in the Instance Settings inside the Zomdroid app.
When preparing your Project Zomboid Linux game files before creating your instance ZIP:
From the PZO Releases page, download PZOptimEngine.jar. (You do NOT need libpzo_native64.so on Android ARM64).
Copy PZOptimEngine.jar directly into the root of your Project Zomboid Linux game files (where projectzomboid.jar resides).
Copy the PZO Steam Workshop Mod (Folder 3787481250 or Contents/mods/Project-Zomboid-Optimiser) into your game's mods/ directory.
Select all files inside the game directory (not the parent folder) and compress them into a .zip archive. In Zomdroid, create a new instance and import your ZIP file.
- Open the Zomdroid app.
- Select your instance and tap Edit Settings (gear icon).
- Find the JVM Arguments (or Java Arguments) field.
- Add the following arguments:
-javaagent:PZOptimEngine.jar -Xmx3072m -Xms2048m -XX:+UseG1GC -XX:+AlwaysPreTouch -XX:+UnlockExperimentalVMOptions -XX:+UseSuperWord -
Tune
-Xmxaccording to your device's total RAM:-
6 GB RAM Devices: Set
-Xmx2560mand-Xms1536m -
8 GB RAM Devices: Set
-Xmx3584mand-Xms2048m -
12 GB+ RAM Devices: Set
-Xmx5120mand-Xms2048m
-
6 GB RAM Devices: Set
Warning
Never set -Xmx to your phone's total RAM! The Android OS, Linux container, and Adreno/Mali GPU all share system memory. Setting -Xmx too high triggers the Android Low Memory Killer (LMK) to terminate the app during map loading.
If you already have a working Zomdroid instance on your phone:
- Open a mobile file manager (such as ZArchiver, MT Manager, or Solid Explorer).
- Navigate to your Zomdroid instance folder:
/storage/emulated/0/Android/data/com.zomdroid/files/instances/<InstanceName>/- (or
/sdcard/Zomdroid/instances/<InstanceName>/)
- Copy
PZOptimEngine.jarinto this instance folder. - Copy the Workshop mod folder into the instance's
mods/directory. - In the Zomdroid app, tap the Settings (gear icon) on that instance.
- In JVM Arguments, append:
(Ensure
-javaagent:PZOptimEngine.jar -XX:+UseG1GC-Xmxis set appropriately as shown above). - Save and launch!
To achieve stable 40–60 FPS on mobile:
-
Graphics Driver / Renderer:
- Snapdragon (Adreno): Select Turnip (Vulkan). Turnip provides the highest compatibility, avoids GL4ES shader include limitations, and delivers optimal framerates.
- MediaTek / Exynos (Mali): Select GL4ES or ANGLE depending on your SoC generation. (See shader notice above for GL4ES).
-
Internal Resolution:
- Set rendering resolution to 720p (1280x720) or 1080p (1920x1080).
- Tip: 720p on a 6-inch smartphone display looks crisp while drastically saving GPU fillrate and battery.
- Texture Quality: Medium (saves critical mobile VRAM).
- Dynamic Puddle Quality: None or Low.
- Lighting Quality: Low or Medium.
- Zoom Levels: Uncheck 200% and 250% zoom to reduce offscreen tile generation.
Caution
F10 Key Conflict with Zomdroid Backup: In Zomdroid, F10 is already mapped as the built-in backup key! Pressing F10 will trigger an instance backup rather than opening PZO.
- Recommendation: Remap the PZO Control Center hotkey in mod options, or use an on-screen button / virtual key mapped to an alternate key (such as F9 or F11) to avoid triggering unintended backups during gameplay.
When in the PZO Control Center:
- Quarter-Res Fog: Keep Enabled (cuts 75% of GPU fog fillrate math).
- Blood Decal Limiter: Set to Low (500) to prevent memory churn during combat.
- Corpse Audio Limiter: Keep Enabled to stop audio buffer underruns.
-
Cause: You may have modified
ProjectZomboid64.jsonor replaced the classpath. Zomdroid manages its own classpath; altering it breaks the game startup. -
Fix: Restore your original
ProjectZomboid64.json. Put-javaagent:PZOptimEngine.jarstrictly in Zomdroid's JVM Arguments inside the instance settings, and never touch the classpath.
- Cause: Android Low Memory Killer terminated the process because JVM heap plus native memory exceeded available device RAM.
-
Fix: Lower
-Xmxin Zomdroid Instance Settings (e.g. from-Xmx4096mdown to-Xmx3072mor-Xmx2560m). Close background applications before launching.
-
Cause: On Build 41 with the GL4ES renderer, custom replacement shaders that contain
#includestatements (util/math,util/hueShift,util/bodyMask) fail to compile because GL4ES does not expand includes. Functions likergb2hsvandperformPaddedBodyMaskare reported missing, and shaders fail to link. -
Fix:
- On Snapdragon devices: switch your graphics driver in Zomdroid settings from GL4ES to Turnip (Vulkan).
- If using GL4ES: disable the mod's custom replacement shaders and use vanilla shaders.
- On Build 42, check the dedicated
zomdroidbranch where shader pipelines are refactored for mobile GLSL 1.20 and 8-sampler limits.
- Cause: F10 is Zomdroid's built-in backup hotkey.
- Fix: Map an on-screen custom button or use an alternate key (e.g. F9/F11) for PZO, or configure the hotkey in the PZO Lua options.
-
Cause:
libpzo_native64.sois compiled for x86_64 desktop Linux with AVX2 and cannot run on ARM64 Android processors. - Behavior: This is completely normal and harmless. PZO automatically detects the architecture and falls back to pure Java processing. All key engine optimizations (fog governor, LOS caching, chunk streaming) continue to work in pure Java.
-
Cause: Desktop shaders using
#version 330fail to compile or link on mobile GL4ES / OpenGLES 2.0 when paired with#version 110fragment shaders, causing a shader fallback wherevertColourevaluates to pure red(1.0, 0.0, 0.0). -
Fix: Use the dedicated
zomdroidbranch of PZO. Thezomdroidbranch converts all character, zombie, and clothing mask shaders to strict GLSL 1.20 with standardattributeandvaryingsyntax and sets clean unit vertex colors.
-
Cause: Stock desktop vehicle shaders declare 10 texture samplers (including reflection cubemaps). Mobile OpenGLES 2.0 and GL4ES enforce a hardware limit of
GL_MAX_TEXTURE_IMAGE_UNITS = 8(units 0–7). Texture units 8 and 9 fail to bind on mobile GPUs, causing vehicle body textures to drop completely. -
Fix: Use the
zomdroidbranch of PZO. Thezomdroidbranch replaces vehicle shaders with the optimized 8-sampler non-reflection pipeline, ensuring vehicles render with full textures, paint colors, blood, rust, and damage overlays without exceeding mobile texture unit limits.
- Zomdroid Official GitHub: udarmolota/zomdroid
- Zomdroid Community Subreddit: r/zomdroid
- PZO Steam Workshop Mod: Project Zomboid Optimiser (Item 3787481250)
- PZO GitHub Releases: prop11/PZO-Launcher