Files
games/docs/development/006-ANDROID_RUST_NATIVE_BUILD.md

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 :

  1. extrait libSDL3.so depuis l'AAR ;
  2. l'utilise comme bibliothèque de liaison pour le build Rust ;
  3. copie libSDL3.so dans le jniLibs/<abi>/ du module Android ;
  4. lance cargo ndk ;
  5. 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.