From 58ecd667b0b5483c7933f9811f816f877c078562 Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Mon, 21 Sep 2026 14:10:30 +0200 Subject: [PATCH] 0.3.3-2-beta.1 --- Android/README.md | 8 +- Cargo.toml | 2 +- deltas/0.3.3/2-beta.1.md | 139 ++++++++++++++++++ .../006-ANDROID_RUST_NATIVE_BUILD.md | 16 +- ...03-V0_3_3_ANDROID_NATIVE_MULTI_ABI_PLAN.md | 10 +- ...5-V0_3_3_ANDROID_NATIVE_MULTI_ABI_AUDIT.md | 10 +- history/0.3.3/0-pre.5.md | 137 +++++++++++++++++ 7 files changed, 305 insertions(+), 17 deletions(-) create mode 100644 deltas/0.3.3/2-beta.1.md create mode 100644 history/0.3.3/0-pre.5.md diff --git a/Android/README.md b/Android/README.md index 2703d67..15bfead 100644 --- a/Android/README.md +++ b/Android/README.md @@ -1,5 +1,5 @@ - + # Android @@ -105,9 +105,11 @@ Le builder historique `scripts/build_android_rust.py` est supprimé en `0-pre.5` Le plancher Android reste `minSdk 21` / Android 5.0, qui correspond au minimum Android documenté par SDL3. Le niveau Rust transmis à `cargo ndk` reste également `21`. -La baseline utilise AGP `9.4.0` et NDK `r28c`. Les bibliothèques Rust produites par ce NDK doivent être alignées pour des pages de 16 KB ; SDL3 étant fourni sous forme précompilée, `libSDL3.so` doit être vérifiée dans l'artefact final au même titre que `libgame_android_entrypoint.so`. La gate `0-pre.5` contrôle les segments ELF avec `llvm-objdump`, puis l'alignement ZIP de l'APK avec `zipalign -P 16`. +La baseline utilise AGP `9.4.0` et NDK `r28c`. Pour la contrainte Google Play 16 KB sur appareils 64 bits, les bibliothèques `arm64-v8a` et `x86_64` doivent être compatibles 16 KB ; SDL3 étant fourni sous forme précompilée, `libSDL3.so` est vérifiée au même titre que `libgame_android_entrypoint.so`. La gate `0-pre.5` a confirmé des segments ELF `LOAD` alignés au moins à `2**14` pour ces deux ABI, puis un `zipalign -P 16` réussi sur les APK. -L'AAB doit contenir les deux bibliothèques pour les quatre ABI sous `base/lib//`. Si `bundletool` est disponible dans l'environnement de validation, `bundletool dump config --bundle=` doit également annoncer `PAGE_ALIGNMENT_16K`. +Les ABI 32 bits `armeabi-v7a` et `x86` restent supportées pour compatibilité matérielle ancienne ; leurs segments observés à `2**12` ne contredisent pas l'exigence Play 16 KB, qui s'applique aux appareils 64 bits. L'AAB doit néanmoins contenir les deux bibliothèques pour les quatre ABI sous `base/lib//`. Si `bundletool` est disponible dans l'environnement de validation, `bundletool dump config --bundle=` peut compléter le contrôle du bundle. + +La preuve runtime `0-pre.5` couvre également Android 5.0/API 21 sur x86 et Android 15/API 35 x86_64 avec `getconf PAGE_SIZE=16384` sur une image `ps16k`. ## Bridge JNI et tactile diff --git a/Cargo.toml b/Cargo.toml index 5c535b5..39870ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ members = [ ] [workspace.package] -version = "0.3.3-0-pre.5" +version = "0.3.3-2-beta.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/games" diff --git a/deltas/0.3.3/2-beta.1.md b/deltas/0.3.3/2-beta.1.md new file mode 100644 index 0000000..625bee9 --- /dev/null +++ b/deltas/0.3.3/2-beta.1.md @@ -0,0 +1,139 @@ + + + +# Delta 0.3.3-2-beta.1 + +## Objectif + +Entrer en beta avec le pipeline Android SDL3 natif feature-complete : quatre ABI, APK universal, AAB Release, API 21 prouvée, compatibilité 16 KB 64 bits prouvée et aucun orchestrateur Python de build. + +Cette tranche n'ajoute aucune fonctionnalité. Elle synchronise la version technique, consolide les preuves `0-pre.5` et exécute la validation large prévue avant RC. + +## Baseline acceptée + +`0.3.3-0-pre.5` est validée par l'utilisateur le 2026-09-21. + +La baseline acceptée comprend : + +- audits Rust/Markdown propres ; +- audit de distribution propre après suppression de deux anciens `src/main/jniLibs` locaux ; +- `cargo check --workspace` et Clippy workspace strict propres ; +- `bundleRelease` réussi pour Snake et Reflex ; +- AAB quatre ABI pour les deux jeux ; +- `zipalign -P 16` réussi sur les APK Debug ; +- ELF `arm64-v8a` et `x86_64` alignés `2**14` pour SDL3 et la bibliothèque Rust ; +- smoke Snake réussi sur Android 5.0/API 21 x86 ; +- smoke Snake réussi sur Android 15/API 35 x86_64 `ps16k` avec `getconf PAGE_SIZE=16384` ; +- suppression du builder `scripts/build_android_rust.py`. + +`history/0.3.3/0-pre.5.md` consigne le détail. + +## Changements + +- passage de `workspace.package.version` à `0.3.3-2-beta.1` ; +- ajout de l'historique validé `0-pre.5` ; +- correction documentaire du périmètre 16 KB : exigence Play portée sur les appareils 64 bits, sans imposer artificiellement `2**14` aux ABI 32 bits ; +- consolidation du plan actif avec les preuves API 21 et `ps16k` réellement obtenues ; +- aucune modification de gameplay, moteur, JNI, Java, logique Gradle, ABI, API Android, dépendance ou asset. + +`CHANGELOG.md` et `ROADMAP.md` restent inchangés : la synthèse publiée est réservée à la RC/stable et le scope macro `0.3.3` n'est pas encore clos. + +## Validation beta — statique et workspace + +Depuis la racine : + +```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 Web deltas history +python3 scripts/audit_distribution_layout.py + +cargo check --workspace +cargo clippy --workspace --all-targets --all-features -- -D warnings +cargo test --workspace --all-targets --all-features +``` + +La suite workspace complète est volontairement exécutée ici : `2-beta.1` constitue la gate large planifiée de la version. + +## Rebuild Android beta + +Nettoyer les outputs Gradle des applications, puis reconstruire les deux formes d'artefact : + +```bash +(cd Android && gradle :game-snake-poc:clean :game-reflex-poc:clean) + +(cd Android && gradle :game-snake-poc:assembleDebug) +(cd Android && gradle :game-reflex-poc:assembleDebug) + +(cd Android && gradle :game-snake-poc:bundleRelease) +(cd Android && gradle :game-reflex-poc:bundleRelease) +``` + +Pour chaque APK Debug et AAB Release, vérifier les quatre ABI : + +```bash +for game in game-snake-poc game-reflex-poc; do + APK="Android/${game}/build/outputs/apk/debug/${game}-debug.apk" + AAB="Android/${game}/build/outputs/bundle/release/${game}-release.aab" + + test -f "$APK" + test -f "$AAB" + + for abi in arm64-v8a armeabi-v7a x86_64 x86; do + unzip -Z1 "$APK" | grep -Fx "lib/${abi}/libSDL3.so" + unzip -Z1 "$APK" | grep -Fx "lib/${abi}/libgame_android_entrypoint.so" + 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 le packaging 16 KB : + +```bash +ZIPALIGN="$(find "$ANDROID_HOME/build-tools" -mindepth 2 -maxdepth 2 -type f -name zipalign -print | sort -V | tail -n 1)" +test -x "$ZIPALIGN" + +"$ZIPALIGN" -c -P 16 -v 4 Android/game-snake-poc/build/outputs/apk/debug/game-snake-poc-debug.apk +"$ZIPALIGN" -c -P 16 -v 4 Android/game-reflex-poc/build/outputs/apk/debug/game-reflex-poc-debug.apk +``` + +Les preuves ELF 64 bits et les smokes de frontière API 21/16 KB viennent d'être établis en `0-pre.5`; ils ne sont pas rejoués mécaniquement dans cette beta tant qu'aucune logique native/Gradle n'a changé. + +## Smokes beta de référence + +Revalider **Snake et Reflex** sur : + +1. l'AVD x86_64/API 36 de référence ; +2. l'appareil ARM64 réel de référence. + +Pour chaque jeu et chaque device : + +```bash +adb -s install -r +adb -s shell am start -n / +``` + +Vérifier au minimum : + +- démarrage ; +- rendu SDL3 ; +- contrôles/tactile ; +- assets ; +- absence de crash/panic immédiat ; +- Back système et sortie propre. + +Les packages/activities actuels sont : + +```text +Snake : com.sasedev.games.snake/.SnakeActivity +Reflex : com.sasedev.games.reflex/.ReflexActivity +``` + +## Transition + +Si la gate workspace, les rebuilds quatre ABI, le packaging et les quatre smokes de référence sont propres, ne pas créer de beta supplémentaire : ouvrir directement `0.3.3-3-rc.1`. + +Toute régression imputable au projet produit d'abord `0.3.3-2-beta.1.fix.N`. diff --git a/docs/development/006-ANDROID_RUST_NATIVE_BUILD.md b/docs/development/006-ANDROID_RUST_NATIVE_BUILD.md index 6bdcb94..b49034e 100644 --- a/docs/development/006-ANDROID_RUST_NATIVE_BUILD.md +++ b/docs/development/006-ANDROID_RUST_NATIVE_BUILD.md @@ -1,5 +1,5 @@ - + # Build Rust Android natif @@ -99,14 +99,18 @@ Le builder historique `scripts/build_android_rust.py` est retiré : il n'existe ### Pages mémoire 16 KB -La validation porte sur les deux dimensions requises : +La validation porte sur les deux dimensions requises pour les appareils 64 bits concernés par la contrainte Google Play 16 KB : -1. segments ELF de chaque `.so` avec un alignement `LOAD` au moins `2**14`, contrôlés par `llvm-objdump -p` depuis le NDK configuré ; +1. segments ELF des `.so` `arm64-v8a` et `x86_64` avec un alignement `LOAD` au moins `2**14`, contrôlés par `llvm-objdump -p` depuis le NDK configuré ; 2. alignement ZIP de l'APK avec `zipalign -c -P 16 -v 4`. -AGP `9.4.0` est supérieur au plancher `8.5.1` documenté pour le packaging 16 KB et NDK `r28c` produit les nouvelles bibliothèques avec alignement 16 KB par défaut. Cette propriété ne dispense pas de contrôler `libSDL3.so`, qui est précompilée dans l'AAR. +AGP `9.4.0` est supérieur au plancher `8.5.1` documenté pour le packaging 16 KB et NDK `r28c` produit les nouvelles bibliothèques 64 bits avec alignement 16 KB par défaut. Cette propriété ne dispense pas de contrôler `libSDL3.so`, qui est précompilée dans l'AAR. -Pour l'AAB, les huit bibliothèques doivent être présentes sous `base/lib//`. Lorsque `bundletool` est disponible, `bundletool dump config --bundle=` doit indiquer `PAGE_ALIGNMENT_16K`. +Les ABI 32 bits `armeabi-v7a` et `x86` restent dans le package pour compatibilité ancienne et peuvent conserver des segments ELF `2**12` ; cela ne constitue pas un échec de l'exigence Play 16 KB, explicitement portée sur les appareils 64 bits. + +Pour l'AAB, les huit bibliothèques doivent être présentes sous `base/lib//`. Lorsque `bundletool` est disponible, `bundletool dump config --bundle=` peut compléter la vérification du mode d'alignement du bundle. + +La preuve runtime utilise une image Android 15/API 35 x86_64 `ps16k` et retient `adb shell getconf PAGE_SIZE` comme contrôle de la taille de page du device. `16384` est le résultat attendu ; une valeur `KernelPageSize` lue dans un VMA particulier de `/proc//smaps` n'est pas utilisée comme substitut à ce contrôle. ### Plancher Android @@ -115,7 +119,7 @@ Le contrat est consolidé à Android 5.0 / API 21 : - `minSdk 21` dans chaque application ; - `sasedevRustAndroidApi = 21` pour `cargo ndk` ; - SDL3 documente API 21 comme minimum Android ; -- un smoke API 21 est souhaité lorsqu'une image 32/64 bits exploitable est disponible, mais l'absence locale d'une telle image est consignée comme lacune de runtime et ne modifie pas artificiellement le contrat. +- la gate `0-pre.5` a validé un smoke réel sur Android 5.0/API 21 x86 : installation de l'APK universal et démarrage de `SnakeActivity` réussis. ## Smoke appareil diff --git a/docs/plans/003-V0_3_3_ANDROID_NATIVE_MULTI_ABI_PLAN.md b/docs/plans/003-V0_3_3_ANDROID_NATIVE_MULTI_ABI_PLAN.md index 3dd351a..853f872 100644 --- a/docs/plans/003-V0_3_3_ANDROID_NATIVE_MULTI_ABI_PLAN.md +++ b/docs/plans/003-V0_3_3_ANDROID_NATIVE_MULTI_ABI_PLAN.md @@ -1,5 +1,5 @@ - + # Plan 0.3.3 — Android SDL3 natif multi-ABI et packaging Gradle @@ -170,7 +170,9 @@ Mettre à jour les documents Android/JNI/build durables pour décrire le chemin ### `2-beta.1` — validation large et packaging final -Exécuter la gate Rust/workspace large planifiée et les tâches Android finales pour Snake et Reflex réellement inclus. Reconstruire l'APK universal et l'AAB depuis un état nettoyé raisonnablement, puis revalider AVD x86_64, appareil ARM64, ABI packagées, 16 KB et compatibilité basse disponible. +`0-pre.5` a fermé le scope d'implémentation : AAB quatre ABI, Release Cargo pilotée par Gradle, suppression du builder Python, audit propre après suppression des anciens `src/main/jniLibs`, alignement 16 KB validé sur les ABI 64 bits, smoke API 21/x86 et smoke API 35/x86_64 `ps16k`. + +La beta n'ajoute donc aucune capacité. Elle synchronise la version technique, consigne la preuve `0-pre.5`, exécute la gate Rust/workspace large planifiée, reconstruit les APK universal et AAB Snake/Reflex, puis revalide les smokes de référence x86_64 et ARM64. Les preuves de frontière API 21 et 16 KB restent dans l'historique `0-pre.5` et ne sont rejouées que si une modification ultérieure affecte le runtime/package natif. Corriger uniquement par `2-beta.1.fix.N` si nécessaire ; ne pas ouvrir une beta cérémonielle supplémentaire si la matrice est propre. @@ -216,8 +218,8 @@ La politique a été révisée après validation de `0-pre.2` : le projet Androi - un build Gradle Android natif n'exige plus `scripts/build_android_rust.py` ; - Snake et Reflex produisent un APK universal contenant `arm64-v8a`, `armeabi-v7a`, `x86_64` et `x86` par un seul chemin Gradle ; - l'AAB de distribution est constructible sans secret embarqué ; -- les bibliothèques natives finales sont vérifiées pour la contrainte 16 KB ; -- le minSdk soutenu et la preuve de smoke disponible sont documentés sans surpromesse ; +- les bibliothèques natives 64 bits finales sont vérifiées pour la contrainte 16 KB et un smoke `ps16k` retourne `PAGE_SIZE=16384` ; +- `minSdk 21` est validé par un smoke réel Android 5.0/API 21 x86 ; - l'appareil ARM64 réel et l'AVD x86_64 passent le smoke prévu ; - Reflex est soit branché naturellement au pipeline commun, soit explicitement borné selon les résultats de factorisation ; - le script Python historique Android est supprimé et l'audit interdit son retour ; diff --git a/docs/studies/025-V0_3_3_ANDROID_NATIVE_MULTI_ABI_AUDIT.md b/docs/studies/025-V0_3_3_ANDROID_NATIVE_MULTI_ABI_AUDIT.md index d0bb0f5..2a8b8dc 100644 --- a/docs/studies/025-V0_3_3_ANDROID_NATIVE_MULTI_ABI_AUDIT.md +++ b/docs/studies/025-V0_3_3_ANDROID_NATIVE_MULTI_ABI_AUDIT.md @@ -1,5 +1,5 @@ - + # Audit Android SDL3 natif multi-ABI pour 0.3.3 @@ -268,6 +268,10 @@ Le scope tient dans `0.3.3` si chaque tranche reste centrée sur un résultat ve La gate `0-pre.4` du 2026-09-21 a confirmé que les quatre targets Rust Android sont installées et que Snake comme Reflex compilent avec succès `arm64-v8a`, `armeabi-v7a`, `x86_64` et `x86`. Les deux APK Debug universal contiennent les huit bibliothèques attendues. -La fermeture `0-pre.5` peut donc retirer le builder Python historique sans perdre de responsabilité fonctionnelle. La validation 16 KB suit la méthode Android actuelle : AGP 8.5.1+ pour le packaging, NDK r28+ pour l'alignement ELF par défaut, contrôle direct de tous les `.so` avec `llvm-objdump`, contrôle APK avec `zipalign -P 16`, et contrôle `PAGE_ALIGNMENT_16K` du bundle lorsque `bundletool` est disponible. SDL3 restant un prébuild, son alignement doit être contrôlé explicitement. +La fermeture `0-pre.5` a retiré le builder Python historique sans perdre de responsabilité fonctionnelle. Les deux `bundleRelease` ont réussi et les AAB Snake/Reflex contiennent les deux bibliothèques natives pour `arm64-v8a`, `armeabi-v7a`, `x86_64` et `x86`. -Le plancher `minSdk 21` est consolidé parce qu'il correspond au minimum Android documenté par SDL3 ; un smoke sur API 21 reste une preuve runtime additionnelle lorsque l'image est raisonnablement disponible, pas une condition permettant de prétendre à un niveau inférieur. +La validation 16 KB a affiné le critère initial : l'exigence Google Play vise les appareils 64 bits. Les couples SDL3/Rust `arm64-v8a` et `x86_64`, en Debug comme en Release, ont des segments ELF `LOAD` alignés à `2**14`, et `zipalign -P 16` réussit sur les APK. Les variantes 32 bits `armeabi-v7a` et `x86` restent à `2**12`, ce qui est compatible avec leur rôle d'ABI historiques 32 bits et ne constitue pas un échec de la gate 16 KB 64 bits. + +Un AVD Android 15/API 35 x86_64 basé sur l'image `google_apis_playstore_ps16k` a retourné `16384` via `getconf PAGE_SIZE`; l'APK Snake s'y installe, `SnakeActivity` démarre et le processus reste vivant. Une lecture ponctuelle `KernelPageSize: 4 kB` dans `/proc/self/smaps` n'est pas retenue comme mesure du mode de page global : la gate Android utilise `getconf PAGE_SIZE`. + +Le plancher `minSdk 21` est désormais prouvé en runtime : un AVD Android 5.0/API 21 x86 a accepté l'APK universal et lancé `SnakeActivity`. La matrice dispose donc à la fois d'une preuve ancienne x86 32 bits et d'une preuve récente x86_64 16 KB. diff --git a/history/0.3.3/0-pre.5.md b/history/0.3.3/0-pre.5.md new file mode 100644 index 0000000..8f21c17 --- /dev/null +++ b/history/0.3.3/0-pre.5.md @@ -0,0 +1,137 @@ + + + +# 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é.