127 lines
5.5 KiB
Markdown
127 lines
5.5 KiB
Markdown
<!-- file: deltas/0.3.3/0-pre.5.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# 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/<game>/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`.
|