# Delta 0.1.0-0-pre.7 ## Base Base validée : `0.1.0-0-pre.6.fix.1`. ## Validation du delta précédent Le 2026-09-16, l'utilisateur a validé les gates Rust légères ainsi que les trois builds Android `:common`, Reflex et Snake. Les trois commandes Gradle ont terminé par `BUILD SUCCESSFUL`. ## Objectif Introduire le `cdylib` Rust Android, le symbole `SDL_main`, le staging `jniLibs` et préparer le premier lancement réel sur appareil ou émulateur. ## Changements - nouveau crate `crates/apps/game-android-entrypoint` ; - `crate-type = ["cdylib"]` ; - features `reflex` et `snake` activées par build applicatif ; - export contrôlé du symbole `SDL_main` ; - `engine-v1-sdl` utilise `use-pkg-config` uniquement hors Android ; - `SaseGameActivity` charge `SDL3` puis `game_android_entrypoint` ; - script `scripts/build_android_rust.py` pour extraire la bibliothèque SDL3 de l'AAR uniquement pour le linker Rust puis générer `jniLibs` via `cargo-ndk` ; - `jniLibs` générés exclus de Git ; - `versionName` Android porté à `0.1.0-0-pre.7`. ## Exception FFI Le symbole `SDL_main` nécessite un nom ABI stable. Rust 2024 classe `export_name` comme attribut unsafe. Une exception normative unique est donc introduite dans `game-android-entrypoint` : un seul `#[unsafe(export_name = "SDL_main")]`, sans bloc ou fonction unsafe. ## Préflight Android Rust Vérifier le NDK et les outils : ```bash cargo ndk --version rustup target list --installed | grep aarch64-linux-android ``` Si nécessaire : ```bash rustup target add aarch64-linux-android cargo install cargo-ndk ``` SDL demande NDK r28c ou ultérieur. `cargo-ndk` détecte normalement le NDK Android Studio ; `ANDROID_NDK_HOME` peut être utilisé pour forcer un chemin. ## Validation Rust hôte Le delta modifie du Rust : ```bash cargo fmt --all cargo fmt --all -- --check python3 scripts/audit_rust_workspace_rules.py python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates Android deltas history cargo check --workspace cargo clippy --workspace --all-targets --all-features -- -D warnings ``` Test ciblé de la crate d'entrée sans feature : ```bash cargo test -p game-android-entrypoint --no-default-features ``` ## Build natif Android Depuis la racine : ```bash python3 scripts/build_android_rust.py reflex python3 scripts/build_android_rust.py snake ``` Puis : ```bash cd Android gradle :game-reflex-poc:assembleDebug gradle :game-snake-poc:assembleDebug cd .. ``` ## Smoke appareil/émulateur Avec une cible ADB disponible : ```bash adb devices adb install -r Android/game-reflex-poc/build/outputs/apk/debug/game-reflex-poc-debug.apk adb shell am start -n com.sasedev.games.reflex/.ReflexActivity ``` Puis répéter pour Snake : ```bash adb install -r Android/game-snake-poc/build/outputs/apk/debug/game-snake-poc-debug.apk adb shell am start -n com.sasedev.games.snake/.SnakeActivity ``` Le critère de réussite est l'ouverture de la surface SDL sans dialogue `SDL Error`, crash natif ou `UnsatisfiedLinkError`. ## Règle de transition Si les gates Rust, les deux builds natifs, les APK et les deux smokes appareil/émulateur sont propres, passer automatiquement à `0.1.0-0-pre.8`. Si une gate échoue à cause du projet, produire `0.1.0-0-pre.7.fix.1`.