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