# Delta 0.3.3-0-pre.5 ## Objet Fermer le chemin Android natif historique après validation des quatre ABI : étendre l'ownership Gradle aux variantes Release/AAB, consolider `minSdk 21`, préparer la vérification 16 KB et supprimer `scripts/build_android_rust.py`. ## Base Base : `0.3.3-0-pre.4`, validée par l'utilisateur le 2026-09-21 avec Temurin 25.0.4.1, Gradle 9.7.1, audits/Cargo/Clippy propres et builds Debug Snake/Reflex réussis sur `arm64-v8a`, `armeabi-v7a`, `x86_64` et `x86`. `history/0.3.3/0-pre.4.md` consigne cette preuve. ## Changements - version workspace portée à `0.3.3-0-pre.5` ; - `Android/gradle/sasedev-rust-android.gradle` enregistre désormais ses sources `jniLibs` pour toutes les variantes, pas seulement Debug ; - les variantes Release déclenchent `cargo ndk ... build --release`, tandis que Debug conserve le profil Cargo `dev` ; - `bundleRelease` de Snake et Reflex devient donc propriétaire de la reconstruction native quatre ABI ; - `minSdk 21` et `CARGO_NDK_PLATFORM=21` deviennent des invariants audités pour les deux applications ; - le builder historique `scripts/build_android_rust.py` est supprimé via manifest ; - l'audit de distribution interdit désormais le retour de ce script et de `src/main/jniLibs` générés ; - les anciennes commandes RC dépendant du builder Python sont remplacées par les tâches Gradle natives ; - documentation Android/build/plan/étude actualisée pour AAB, API 21 et contrôle 16 KB. Aucun secret de signature ni keystore n'est ajouté. ## Référence 16 KB Le contrôle suit le chemin recommandé par Android : AGP `>= 8.5.1`, NDK `r28+`, vérification ELF par `llvm-objdump`, puis `zipalign -P 16` sur l'APK. La SDL3 de l'AAR est précompilée et doit donc être contrôlée explicitement avec la bibliothèque Rust. ## Validation attendue Depuis la racine : ```bash java -version (cd Android && gradle --version) 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 Web deltas history python3 scripts/audit_distribution_layout.py cargo check --workspace cargo clippy --workspace --all-targets --all-features -- -D warnings (cd Android && gradle :game-snake-poc:bundleRelease) (cd Android && gradle :game-reflex-poc:bundleRelease) ``` Les AAB attendus sont sous `Android//build/outputs/bundle/release/`. Pour chaque bundle : ```bash for game in game-snake-poc game-reflex-poc; do AAB="$(find "Android/${game}/build/outputs/bundle/release" \ -maxdepth 1 -type f -name '*.aab' -print -quit)" test -n "$AAB" printf 'AAB=%s\n' "$AAB" unzip -Z1 "$AAB" | grep '^base/lib/' | sort for abi in arm64-v8a armeabi-v7a x86_64 x86; do unzip -Z1 "$AAB" | grep -Fx "base/lib/${abi}/libSDL3.so" unzip -Z1 "$AAB" | grep -Fx "base/lib/${abi}/libgame_android_entrypoint.so" done done ``` Revalider ensuite l'APK Debug et son alignement ZIP 16 KB avec le `zipalign` des Build Tools installés : ```bash ZIPALIGN="$(find "$ANDROID_HOME/build-tools" -mindepth 2 -maxdepth 2 -type f -name zipalign -print | sort -V | tail -n 1)" test -x "$ZIPALIGN" for game in game-snake-poc game-reflex-poc; do (cd Android && gradle ":${game}:assembleDebug") APK="$(find "Android/${game}/build/outputs/apk/debug" -maxdepth 1 -type f -name '*.apk' -print -quit)" "$ZIPALIGN" -c -P 16 -v 4 "$APK" done ``` Contrôler les segments ELF des bibliothèques générées et de SDL3. Sur Linux avec le NDK configuré : ```bash OBJDUMP="$ANDROID_HOME/ndk/28.2.13676358/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objdump" test -x "$OBJDUMP" for game in game-snake-poc game-reflex-poc; do for variant in debug release; do for abi in arm64-v8a armeabi-v7a x86_64 x86; do for so in \ "Android/${game}/build/generated/sasedevNative/${variant}/${abi}/jniLibs/${abi}/libSDL3.so" \ "Android/${game}/build/generated/sasedevNative/${variant}/${abi}/jniLibs/${abi}/libgame_android_entrypoint.so"; do test -f "$so" printf '%s\n' "$so" "$OBJDUMP" -p "$so" | grep 'LOAD' done done done done ``` Aucun `LOAD` ne doit annoncer un alignement inférieur à `2**14`. Si `bundletool` est installé dans l'environnement : ```bash bundletool dump config --bundle="Android/game-snake-poc/build/outputs/bundle/release/game-snake-poc-release.aab" | grep alignment bundletool dump config --bundle="Android/game-reflex-poc/build/outputs/bundle/release/game-reflex-poc-release.aab" | grep alignment ``` La valeur attendue est `PAGE_ALIGNMENT_16K`. Son absence locale parce que `bundletool` n'est pas installé doit être consignée ; elle ne doit pas être remplacée par une affirmation fictive. Pour le plancher Android, relever les images disponibles : ```bash emulator -list-avds sdkmanager --list_installed | grep 'system-images;android-' || true ``` Si une image API 21 exploitable est déjà disponible ou raisonnablement installable, effectuer un smoke Snake. Sinon, consigner explicitement cette lacune ; le contrat reste API 21 car SDL3 lui-même documente ce niveau comme minimum et le build Rust/manifest l'imposent déjà. ## Suite Si les AAB quatre ABI et les contrôles 16 KB sont propres, la prochaine tranche est `0.3.3-2-beta.1` conformément au plan révisé. Une défaillance du chemin Release/AAB, de l'alignement ou de la fermeture Python produit d'abord `0.3.3-0-pre.5.fix.N`.