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

3.5 KiB
Raw Blame History

Android-порт клиента

Цель — тот же клиент gmod-rs (SDL3 + wgpu), запускаемый как APK на Android 12+ (API 31+). Отдельного «мобильного движка» нет: карта, физика, Lua и рендер общие с десктопом.

Сборка

./android/build.sh                  # arm64-v8a, APK для телефона
ANDROID_ABI=x86_64 ./android/build.sh  # x86_64, для эмулятора

Скрипт использует SDK/NDK, cargo, aapt2, d8, zipalign, apksigner (Gradle не нужен). Результат — target/android/gmod-rs-debug.apk (подписан debug-ключом android/debug.keystore). Подробности и команды установки — в android/README.md.

Крейты и target cfg

  • crates/client теперь и библиотека (src/lib.rs), и бинарь (src/main.rs). Бинарь вызывает client::run(args), Android-сборка — cargo build --lib с crate-type = ["cdylib", "rlib"].
  • Экспорт SDL_main (в lib.rs под cfg(target_os = "android")) — точка входа для штатной Java-обвязки SDL3 (SDLActivity).
  • steamworks подключён только для не-Android; команда net на Android отсутствует.
  • mlua: на десктопе LuaJIT + vendored, на Android — Lua 5.4 + vendored (LuaJIT не собирается кросс-компилятором mlua). API GMod-скриптов сохраняется.
  • tracing на Android пишет в logcat (adb logcat -s gmod-rs), а не в stdout.

APK

  • Java-классы SDL3 (org.libsdl.app.*) взяты из sdl3-src (zlib-лицензия) и лежат в android/app/src/main/java.
  • MainActivity наследует SDLActivity, фиксирует ландшафт и передаёт нативной части аргументы map gm_construct --assets <external files>/....
  • Нативные библиотеки пакуются как lib/arm64-v8a/libSDL3.so и libmain.so (внутри — libclient.so с SDL_main).
  • Ассеты не входят в APK: их кладут во внешний каталог приложения (Android/data/org.gmodrs.client/files/gmod_server/server), см. README.

Управление

Обрабатываются SDL_EVENT_FINGER_*; синтетические события мыши от касаний отключены (SDL_TOUCH_MOUSE_EVENTS=0):

  • левая половина экрана — аналоговый стик (forward/right идут в тот же Player::update, что WASD);
  • правая половина — обзор свайпом (приращение углов камеры);
  • кнопки JUMP/DUCK — прыжок (с защёлкой короткого тапа) и присед;
  • на Android движение сразу бегом (отдельной кнопки Shift нет).

Проверка

  • cargo clippy -p client --lib --target aarch64-linux-android -- -D warnings.
  • Эмулятор API 35 x86_64: APK запускается, gm_construct грузится, кадры рисуются (SwiftShader, ~11–14 fps), стик/обзор/прыжок проверены через adb shell input.
  • Реальное arm64-устройство не проверялось (нет устройства); при отладке — adb logcat -s gmod-rs SDL.