0.3.3-2-beta.1

This commit is contained in:
2026-09-21 14:10:30 +02:00
parent 19f31082ea
commit 58ecd667b0
7 changed files with 305 additions and 17 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: Android/README.md --> <!-- file: Android/README.md -->
<!-- version: 13 --> <!-- version: 14 -->
# Android # 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`. 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/<abi>/`. Si `bundletool` est disponible dans l'environnement de validation, `bundletool dump config --bundle=<aab>` 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/<abi>/`. Si `bundletool` est disponible dans l'environnement de validation, `bundletool dump config --bundle=<aab>` 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 ## Bridge JNI et tactile

View File

@@ -21,7 +21,7 @@ members = [
] ]
[workspace.package] [workspace.package]
version = "0.3.3-0-pre.5" version = "0.3.3-2-beta.1"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://git.sasedev.com/Sasedev/games" repository = "https://git.sasedev.com/Sasedev/games"

139
deltas/0.3.3/2-beta.1.md Normal file
View File

@@ -0,0 +1,139 @@
<!-- file: deltas/0.3.3/2-beta.1.md -->
<!-- version: 1 -->
# 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 <serial> install -r <apk>
adb -s <serial> shell am start -n <package>/<activity>
```
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`.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/development/006-ANDROID_RUST_NATIVE_BUILD.md --> <!-- file: docs/development/006-ANDROID_RUST_NATIVE_BUILD.md -->
<!-- version: 6 --> <!-- version: 7 -->
# Build Rust Android natif # 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 ### 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`. 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/<abi>/`. Lorsque `bundletool` est disponible, `bundletool dump config --bundle=<aab>` 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/<abi>/`. Lorsque `bundletool` est disponible, `bundletool dump config --bundle=<aab>` 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/<pid>/smaps` n'est pas utilisée comme substitut à ce contrôle.
### Plancher Android ### Plancher Android
@@ -115,7 +119,7 @@ Le contrat est consolidé à Android 5.0 / API 21 :
- `minSdk 21` dans chaque application ; - `minSdk 21` dans chaque application ;
- `sasedevRustAndroidApi = 21` pour `cargo ndk` ; - `sasedevRustAndroidApi = 21` pour `cargo ndk` ;
- SDL3 documente API 21 comme minimum Android ; - 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 ## Smoke appareil

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/003-V0_3_3_ANDROID_NATIVE_MULTI_ABI_PLAN.md --> <!-- file: docs/plans/003-V0_3_3_ANDROID_NATIVE_MULTI_ABI_PLAN.md -->
<!-- version: 4 --> <!-- version: 5 -->
# Plan 0.3.3 — Android SDL3 natif multi-ABI et packaging Gradle # 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 ### `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. 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` ; - 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 ; - 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é ; - l'AAB de distribution est constructible sans secret embarqué ;
- les bibliothèques natives finales sont vérifiées pour la contrainte 16 KB ; - les bibliothèques natives 64 bits finales sont vérifiées pour la contrainte 16 KB et un smoke `ps16k` retourne `PAGE_SIZE=16384` ;
- le minSdk soutenu et la preuve de smoke disponible sont documentés sans surpromesse ; - `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 ; - 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 ; - 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 ; - le script Python historique Android est supprimé et l'audit interdit son retour ;

View File

@@ -1,5 +1,5 @@
<!-- file: docs/studies/025-V0_3_3_ANDROID_NATIVE_MULTI_ABI_AUDIT.md --> <!-- file: docs/studies/025-V0_3_3_ANDROID_NATIVE_MULTI_ABI_AUDIT.md -->
<!-- version: 3 --> <!-- version: 4 -->
# Audit Android SDL3 natif multi-ABI pour 0.3.3 # 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 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.

137
history/0.3.3/0-pre.5.md Normal file
View File

@@ -0,0 +1,137 @@
<!-- file: history/0.3.3/0-pre.5.md -->
<!-- version: 1 -->
# 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/<abi>/` :
```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é.