- MainActivity фиксирует ландшафт (SDL перебивал манифест FULL_USER) и передаёт путь к ассетам через getExternalFilesDir; - короткий тап по JUMP не теряется между кадрами (jump_pending); - HUD сдвинут внутрь от статус-бара и нижней панели; - логгер на Android собирается без неиспользуемой ветки.
76 lines
4 KiB
Markdown
76 lines
4 KiB
Markdown
# 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`).
|
||
|
||
## Сборка
|
||
|
||
```bash
|
||
./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`.
|
||
|
||
## Установка
|
||
|
||
```bash
|
||
adb install -r target/android/gmod-rs-debug.apk
|
||
```
|
||
|
||
Ассеты GMod (каталог `server` из установки/DS-сервера) копируются во внешний
|
||
каталог приложения:
|
||
|
||
```bash
|
||
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 + карта): карта грузится и
|
||
рисуется, часть материалов заменяется заглушкой.
|
||
|
||
## Запуск и логи
|
||
|
||
```bash
|
||
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`.
|