Armbat

Контейнер ARMv7 для arm64 Android

Старые игры.Новое железо.

Armbat запускает 32-битные ARM-игры на смартфонах, которые потеряли поддержку 32 бит. Одно приложение, настоящий bionic, GPU устройства. Без root, без второй Android и без виртуального диска.

OSAndroid 12+
ABIarm64-v8a
APKAPK 30,7 MB
КадрыЛистайте вбок

Снято на устройстве, а не в макете.

Четыре игры, четыре движка, один контейнер. Каждый кадр ниже взят из репозитория или из отчёта о совместимости.

N.O.V.A. 3 работает в Armbat на Android
N.O.V.A. 3Захват на arm64-устройстве
Subway Surfers работает в Armbat на Android
Subway SurfersЗахват на arm64-устройстве
Minecraft работает в Armbat на Android
MinecraftЗахват на arm64-устройстве
The Sims 3 работает в Armbat на Android
The Sims 3Захват на arm64-устройстве
Под капотом6

Контейнер, а не эмулятор.

Java-код гостя работает на системном ART. Машинный код ARMv7 транслируется в ARM64 через JIT на Dynarmic. Дальше перечислено, за счёт чего это работает.

arena

Одна плоская арена на 4 ГиБ

Адрес гостя это 32-битное смещение в арене, поэтому fastmem работает без пересчёта указателей при каждом доступе.

bionic

Настоящий bionic

Линкер, libc, libm, libdl и libstdc++ взяты из официального образа armeabi-v7a. Armbat загружает их, а не подменяет libc.

syscalls

SVC #0, диспетчеризация по r7

Каждый системный вызов Linux ARM перехватывается контейнером. Ядро следит за памятью гостя, потоками и сокетами.

SVC #0 / dispatch by r7
hle

HLE только там, где нужно

JNI, AAssetManager, EGL, GLES, liblog, ANativeWindow и OpenSLES получают трамплины в хосте. GLES уходит в драйвер устройства.

input

Проброс ввода

MotionEvent доходит до поверхности гостя с id указателя, индексом действия, давлением и временем, включая мультитач и поворот.

loader

Загрузчик ELF32

Сегменты, DT_NEEDED, dlopen и dlsym, ARM-релокации и DT_INIT_ARRAY. Библиотеки гостя загружаются так, как ждёт платформа.

DT_NEEDED → R_ARM_GLOB_DAT → DT_INIT_ARRAY
Требования4

Что нужно до первого запуска.

Снаружи Armbat выглядит простым. Условия ниже обязательны.

Android 12 или новее

API 31 и выше на arm64-v8a. У устройства может вообще не быть 32-битного ABI.

EGL и GLES 2.0+

Рендер идёт через драйвер GPU хоста, поэтому драйвер должен поддерживать оба API.

Только APK armeabi-v7a

Пока поддерживаются только 32-битные ARMv7-архивы. Пакеты arm64 не транслируются.

Доступ ко всем файлам

Библиотека, сохранения и OBB лежат в общем хранилище. Без разрешения библиотека останется пустой.

Данные можно положить до первого запуска. OBB-файлы идут в android/obb/ внутри папки пакета, сохранения в files/ или external/files/.