# Android-клиент gmod-rs APK под Android 12+ (API 31+), arm64-v8a. Нативный клиент — тот же крейт `client`, что и на десктопе: SDL3 + wgpu. Для Android он собирается как `cdylib` (`libmain.so`) с экспортом `SDL_main`; Java-обвязка — штатная `SDLActivity` из SDL3 (zlib-лицензия, файлы лежат в `app/src/main/java/org/libsdl/app`). ## Сборка ```bash ./android/build.sh ``` Нужны: Android SDK (platform-tools, platforms;android-31+, build-tools, `android.jar`), NDK (проверено на r29), cmake, Rust с таргетом `aarch64-linux-android`. Скрипт сам находит SDK/NDK (`ANDROID_HOME`, `ANDROID_NDK_HOME` или `/opt/android-sdk`, `/opt/android-ndk`), собирает `libclient.so` + `libSDL3.so`, пакует и подписывает debug-ключом (`android/debug.keystore`, создаётся при первом запуске). Результат: `target/android/gmod-rs-debug.apk`. ## Установка ```bash adb install -r target/android/gmod-rs-debug.apk ``` Ассеты GMod (каталог `server` из установки/DS-сервера) копируются во внешний каталог приложения: ```bash adb shell mkdir -p /sdcard/Android/data/org.gmodrs.client/files/gmod_server adb push ~/gmod_server/server /sdcard/Android/data/org.gmodrs.client/files/gmod_server/ # adb создаёт каталоги от shell, а приложению нужен доступ: adb shell chmod -R 777 /sdcard/Android/data/org.gmodrs.client/files/gmod_server ``` Приложение по умолчанию открывает `gm_construct` и ищет ассеты в `/sdcard/Android/data/org.gmodrs.client/files/gmod_server/server` (точный путь передаёт `MainActivity` через `getExternalFilesDir`). Другой путь можно задать переменной `GMOD_RS_ASSETS` — но на телефоне переменные окружения задать непросто, поэтому проще положить ассеты по стандартному пути. Минимально для `gm_construct` достаточно `garrysmod/` (карты и контент игры) и `sourceengine/` (текстуры/модели HL2); `platform/` нужен для части эффектов. Проверено на усечённом наборе (garrysmod VPK + карта): карта грузится и рисуется, часть материалов заменяется заглушкой. ## Запуск и логи ```bash adb shell am start -n org.gmodrs.client/.MainActivity adb logcat -s gmod-rs SDL ``` ## Управление - левая половина экрана — виртуальный стик (ходьба, сразу бегом); - правая половина — свайп обзора; - кнопки `JUMP` и `DUCK` справа снизу; - системная кнопка «назад» завершает приложение (SDL присылает Escape). ## Ограничения - Steam/сеть отключены на Android: `steamworks` не собирается под эту цель, команда `net` недоступна. - Lua на Android — Lua 5.4 (vendored), а не LuaJIT: кросс-сборка LuaJIT под Android в mlua не поддерживается. API GMod-скриптов тот же. - Собран и проверен `arm64-v8a` (APK для телефона) и `x86_64` (эмулятор). Проверка в эмуляторе API 35: карта грузится, кадры рисуются через SwiftShader (11–14 fps на софтверном GPU), стик/обзор/прыжок работают. На реальном arm64-устройстве не запускалось — проверьте `adb logcat`. - Для эмулятора: `ANDROID_ABI=x86_64 ./android/build.sh`, результат — `target/android/gmod-rs-debug-x86_64.apk`.