- MainActivity фиксирует ландшафт (SDL перебивал манифест FULL_USER) и передаёт путь к ассетам через getExternalFilesDir; - короткий тап по JUMP не теряется между кадрами (jump_pending); - HUD сдвинут внутрь от статус-бара и нижней панели; - логгер на Android собирается без неиспользуемой ветки.
4 KiB
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.