Одна плоская арена на 4 ГиБ
Адрес гостя это 32-битное смещение в арене, поэтому fastmem работает без пересчёта указателей при каждом доступе.
Контейнер ARMv7 для arm64 Android
Armbat запускает 32-битные ARM-игры на смартфонах, которые потеряли поддержку 32 бит. Одно приложение, настоящий bionic, GPU устройства. Без root, без второй Android и без виртуального диска.
Четыре игры, четыре движка, один контейнер. Каждый кадр ниже взят из репозитория или из отчёта о совместимости.




Главная остаётся короткой. Полный архив совместимости и все релизы — на отдельных страницах.
Java-код гостя работает на системном ART. Машинный код ARMv7 транслируется в ARM64 через JIT на Dynarmic. Дальше перечислено, за счёт чего это работает.
Адрес гостя это 32-битное смещение в арене, поэтому fastmem работает без пересчёта указателей при каждом доступе.
Линкер, libc, libm, libdl и libstdc++ взяты из официального образа armeabi-v7a. Armbat загружает их, а не подменяет libc.
Каждый системный вызов Linux ARM перехватывается контейнером. Ядро следит за памятью гостя, потоками и сокетами.
SVC #0 / dispatch by r7JNI, AAssetManager, EGL, GLES, liblog, ANativeWindow и OpenSLES получают трамплины в хосте. GLES уходит в драйвер устройства.
MotionEvent доходит до поверхности гостя с id указателя, индексом действия, давлением и временем, включая мультитач и поворот.
Сегменты, DT_NEEDED, dlopen и dlsym, ARM-релокации и DT_INIT_ARRAY. Библиотеки гостя загружаются так, как ждёт платформа.
DT_NEEDED → R_ARM_GLOB_DAT → DT_INIT_ARRAYСнаружи Armbat выглядит простым. Условия ниже обязательны.
API 31 и выше на arm64-v8a. У устройства может вообще не быть 32-битного ABI.
Рендер идёт через драйвер GPU хоста, поэтому драйвер должен поддерживать оба API.
Пока поддерживаются только 32-битные ARMv7-архивы. Пакеты arm64 не транслируются.
Библиотека, сохранения и OBB лежат в общем хранилище. Без разрешения библиотека останется пустой.
Данные можно положить до первого запуска. OBB-файлы идут в android/obb/ внутри папки пакета, сохранения в files/ или external/files/.