gmod-rs/android
Niko Marmeladkov 6f949085a9 Android: кросс-сборка клиента, SDL-обвязка и сенсорное управление
- client получил lib.rs (общий запуск) и cdylib с экспортом SDL_main;
- steamworks и mlua-фичи разведены по target cfg: на Android нет Steam,
  Lua 5.4 вместо LuaJIT;
- виртуальный стик, обзор свайпом и кнопки прыжка/приседа в map;
- android/: манифест, SDLActivity Java, build.sh (aapt2+d8+apksigner).
2026-10-23 13:37:11 +03:00
..
app/src/main/java/org/libsdl/app Android: кросс-сборка клиента, SDL-обвязка и сенсорное управление 2026-10-23 13:37:11 +03:00
.gitignore Android: кросс-сборка клиента, SDL-обвязка и сенсорное управление 2026-10-23 13:37:11 +03:00
AndroidManifest.xml Android: кросс-сборка клиента, SDL-обвязка и сенсорное управление 2026-10-23 13:37:11 +03:00
build.sh Android: кросс-сборка клиента, SDL-обвязка и сенсорное управление 2026-10-23 13:37:11 +03:00
README.md Android: кросс-сборка клиента, SDL-обвязка и сенсорное управление 2026-10-23 13:37:11 +03:00

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/

Приложение по умолчанию открывает gm_construct и ищет ассеты в /sdcard/Android/data/org.gmodrs.client/files/gmod_server/server. Другой путь можно задать переменной GMOD_RS_ASSETS (например, через adb shell setprop не сработает — переменные окружения Android-приложения задаются только из Java/обвязки; для отладки удобнее положить ассеты по стандартному пути).

Минимально для gm_construct достаточно garrysmod/ (карты и контент игры) и sourceengine/ (текстуры/модели HL2); platform/ нужен для части эффектов.

Управление

  • левая половина экрана — виртуальный стик (ходьба, сразу бегом);
  • правая половина — свайп обзора;
  • кнопки JUMP и DUCK справа снизу;
  • системная кнопка «назад» завершает приложение (SDL присылает Escape).

Ограничения

  • Steam/сеть отключены на Android: steamworks не собирается под эту цель, команда net недоступна.
  • Lua на Android — Lua 5.4 (vendored), а не LuaJIT: кросс-сборка LuaJIT под Android в mlua не поддерживается. API GMod-скриптов тот же.
  • Проверено только arm64-v8a; x86_64-эмулятор требует отдельной сборки (см. ANDROID_ABI/TARGET в build.sh).