One flat 4 GiB arena
A guest address is a 32-bit offset into one arena, so fastmem works without translating pointers on every access.
ARMv7 container for arm64 Android
Armbat runs 32-bit ARM games on phones that dropped 32-bit support. One app, real bionic, the device GPU. No root, no second Android, no virtual disk.
Four games, four engines, one container. Every capture below comes from the repository or from a compatibility report.




The landing page stays short. The full archive and every release have their own pages.
Guest Java runs on the platform ART. Guest ARMv7 machine code is translated to ARM64 by a JIT built on Dynarmic. Everything below is what makes that work.
A guest address is a 32-bit offset into one arena, so fastmem works without translating pointers on every access.
The linker, libc, libm, libdl and libstdc++ come from an official armeabi-v7a system image. Armbat boots them instead of faking libc.
Every Linux ARM syscall traps into the container. The kernel layer keeps guest memory, threads and sockets in order.
SVC #0 / dispatch by r7JNI, AAssetManager, EGL, GLES, liblog, ANativeWindow and OpenSLES get host trampolines. GLES is forwarded to the device driver.
MotionEvent reaches the guest surface with pointer id, action index, pressure and time intact, including multitouch and rotation.
Segments, DT_NEEDED, dlopen and dlsym, ARM relocations and DT_INIT_ARRAY. Guest libraries load the way the platform expects.
DT_NEEDED → R_ARM_GLOB_DAT → DT_INIT_ARRAYArmbat is small on the surface. The conditions below are not optional.
API 31 and up on arm64-v8a. The device may have no 32-bit ABI at all.
Rendering is forwarded to the host GPU driver, so the driver has to expose both.
Only 32-bit ARMv7 archives are supported for now. arm64 packages are not translated.
The library, saves and OBB files live on shared storage. Without the grant the library stays empty.
Data can be placed before the first launch. OBB files go into android/obb/ inside the package folder, saves into files/ or external/files/.