gmod-rs/android/README.md
Niko Marmeladkov 8d572b8190 Android: ландшафт, HUD над системными панелями, прыжок по тапу
- MainActivity фиксирует ландшафт (SDL перебивал манифест FULL_USER) и
  передаёт путь к ассетам через getExternalFilesDir;
- короткий тап по JUMP не теряется между кадрами (jump_pending);
- HUD сдвинут внутрь от статус-бара и нижней панели;
- логгер на Android собирается без неиспользуемой ветки.
2026-10-23 14:18:45 +03:00

4 KiB
Raw Permalink Blame History

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).

Сборка

./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.

Установка

adb install -r target/android/gmod-rs-debug.apk

Ассеты GMod (каталог server из установки/DS-сервера) копируются во внешний каталог приложения:

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 + карта): карта грузится и рисуется, часть материалов заменяется заглушкой.

Запуск и логи

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.