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

61 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Android-порт клиента
Цель — тот же клиент `gmod-rs` (SDL3 + wgpu), запускаемый как APK на Android
12+ (API 31+). Отдельного «мобильного движка» нет: карта, физика, Lua и рендер
общие с десктопом.
## Сборка
```bash
./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`.