3.0 KiB
Build Rust Android natif
Contrat SDL
SDLActivity charge SDL3, puis game_android_entrypoint, et invoque le symbole SDL_main.
Le crate Rust game-android-entrypoint est un cdylib. Il est compilé avec exactement une feature métier lors du packaging d'une application :
reflex;snake.
Le même nom de bibliothèque native peut être utilisé dans les deux APK puisque chaque module Android possède son propre répertoire jniLibs.
SDL3 AAR et Prefab
L'AAR officiel SDL3 expose ses bibliothèques natives avec Prefab.
Pour arm64-v8a, la structure attendue est notamment :
prefab/modules/SDL3/libs/android.arm64-v8a/libSDL3.so
Le script scripts/build_android_rust.py accepte cette structure officielle et conserve un fallback jni/<abi>/libSDL3.so pour compatibilité.
Pour chaque application, le script :
- extrait
libSDL3.sodepuis l'AAR ; - l'utilise comme bibliothèque de liaison pour le build Rust ;
- copie
libSDL3.sodans lejniLibs/<abi>/du module Android ; - lance
cargo ndk; - vérifie la présence de
libgame_android_entrypoint.so.
Ainsi, SDLActivity dispose au runtime de libSDL3.so et de la bibliothèque Rust applicative.
Toolchain
SDL Android requiert actuellement SDK 35 ou ultérieur, NDK r28c ou ultérieur et API minimale 21. La baseline projet conserve compileSdk 36, minSdk 21 et l'AAR SDL3 3.4.16.
Installer au minimum :
rustup target add aarch64-linux-android
cargo install cargo-ndk
NDK de référence :
r28c = 28.2.13676358
Avec le SDK manager :
"${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" "ndk;28.2.13676358" "platform-tools"
cargo-ndk détecte un NDK installé par Android Studio ou utilise ANDROID_NDK_HOME lorsqu'il est défini.
Pour utiliser directement adb :
export PATH="${ANDROID_HOME}/platform-tools:${PATH}"
Cet export peut être ajouté au fichier de configuration shell local de la machine.
Build
Depuis la racine :
python3 scripts/build_android_rust.py reflex
python3 scripts/build_android_rust.py snake
Puis :
cd Android
gradle :game-reflex-poc:assembleDebug
gradle :game-snake-poc:assembleDebug
cd ..
Les bibliothèques générées sous Android/*/src/main/jniLibs/ sont des artefacts de build et ne sont pas versionnées.
Smoke appareil
Préflight :
adb version
adb devices
Puis installation/lancement des APK si un appareil ou émulateur est disponible.
L'absence de adb ou d'appareil n'est pas un défaut fonctionnel du projet ; elle bloque uniquement le smoke appareil.
Exception FFI Rust
Rust 2024 exige un attribut unsafe pour imposer un nom de symbole d'export. Le projet autorise donc exclusivement #[unsafe(export_name = "SDL_main")] dans game-android-entrypoint. Cette exception ne permet ni bloc unsafe, ni fonction unsafe, ni déréférencement des pointeurs argc/argv.