# Historique 0.3.3-0-pre.5 ## Statut `0.3.3-0-pre.5` a été validé par l'utilisateur le 2026-09-21. La tranche ferme le chemin Android natif historique : Gradle possède les variantes Debug/Release, les AAB quatre ABI sont produits, `minSdk 21` dispose d'une preuve runtime, la compatibilité 16 KB 64 bits est vérifiée et `scripts/build_android_rust.py` est supprimé. Aucun `0-pre.5.fix.N` n'est requis. La suite ouvre `0.3.3-2-beta.1`. ## Toolchain réellement validée ```text OpenJDK / Temurin 25.0.4.1 LTS Gradle 9.7.1 AGP 9.4.0 NDK 28.2.13676358 / r28c ``` Le pipeline utilise le JDK et le Gradle de l'environnement ; aucun `JAVA_HOME` JDK 17 ni wrapper Gradle natif n'est requis. ## Gates statiques et Rust La première exécution de l'audit de distribution a détecté deux anciens répertoires générés laissés localement par le chemin historique : ```text Android/game-reflex-poc/src/main/jniLibs Android/game-snake-poc/src/main/jniLibs ``` Ils ont été supprimés puis l'audit a été rejoué avec succès : ```text Distribution layout audit: clean (49 required path(s), 8 forbidden path(s) absent) ``` Les autres gates fournies sont propres : ```text General Rust rule audit: clean Rust export completeness audit: 0 candidate(s) games.sasedev workspace audit: clean Markdown table audit: clean (5 table(s), 241 file(s)) cargo fmt --all: clean cargo fmt --all -- --check: clean cargo check --workspace: clean cargo clippy --workspace --all-targets --all-features -- -D warnings: clean ``` L'échec initial de layout provenait donc de résidus locaux non versionnés, pas d'un retour du builder Python dans le delta. ## Release et AAB quatre ABI Les commandes suivantes terminent avec `BUILD SUCCESSFUL` : ```text :game-snake-poc:bundleRelease :game-reflex-poc:bundleRelease ``` Pour les deux jeux, Gradle exécute les builds Rust Release pour : ```text arm64-v8a armeabi-v7a x86_64 x86 ``` Les deux AAB contiennent exactement les couples attendus sous `base/lib//` : ```text libSDL3.so libgame_android_entrypoint.so ``` pour chacune des quatre ABI. ## Packaging et pages 16 KB `zipalign -c -P 16 -v 4` réussit sur les APK Debug Snake et Reflex. Les contrôles ELF Debug et Release montrent : ```text arm64-v8a -> LOAD align 2**14 x86_64 -> LOAD align 2**14 armeabi-v7a -> LOAD align 2**12 x86 -> LOAD align 2**12 ``` pour SDL3 et `libgame_android_entrypoint.so`. Le critère 16 KB est appliqué aux ABI/appareils 64 bits, conformément à l'exigence Google Play. Les alignements `2**12` des ABI 32 bits ne constituent donc pas un échec. ## Preuve Android 5.0 / API 21 Un AVD basé sur : ```text system-images/android-21/google_apis/x86/ ``` retourne : ```text API 21 ABI x86 KernelPageSize 4 kB ``` L'APK Snake universal est installé avec succès et `SnakeActivity` démarre. `minSdk 21` dispose donc d'une preuve runtime réelle sur x86 32 bits. ## Preuve Android 15 / 16 KB Un AVD basé sur : ```text system-images/android-35/google_apis_playstore_ps16k/x86_64/ ``` retourne : ```text API 35 ABI x86_64 getconf PAGE_SIZE = 16384 ``` L'APK Snake s'installe, `SnakeActivity` démarre et `pidof com.sasedev.games.snake` retourne un PID actif. Une lecture séparée de `/proc/self/smaps` retourne `KernelPageSize: 4 kB` pour le mapping inspecté. Cette valeur n'est pas utilisée comme mesure du mode global du device ; la preuve de taille de page de l'environnement repose sur `getconf PAGE_SIZE=16384`. ## Conséquence Le scope d'implémentation `0-pre.*` est fermé. La beta peut se concentrer sur la validation large, la reproductibilité du packaging quatre ABI et les smokes de référence sans introduire de nouvelle fonctionnalité.