8.3 KiB
Delta 0.3.3-0-pre.3
Base et statut précédent
Cette tranche part exclusivement de 0.3.3-0-pre.2, validé par l'utilisateur le 2026-09-21. history/0.3.3/0-pre.2.md enregistre la gate complète, le build Gradle réussi et l'APK Snake ARM64 inspecté.
Aucun fix de 0-pre.2 n'est requis.
Objectif
Cette tranche traite ensemble les deux décisions prévues avant l'AAB :
- passer d'une version Gradle/JDK imposée pour la preuve à un contrat de minimum compatible avec l'environnement ;
- élargir le pipeline Gradle/Cargo natif à
arm64-v8a + x86_64et produire des APK Debug universal.
Snake reste le jeu-sonde principal. Reflex devient le second consommateur de la logique commune puisque sa migration ne demande qu'un mapping de feature et d'ABI, sans nouvelle architecture.
Politique Gradle minimale
AGP 9.4.0 conserve Gradle 9.6.0 comme minimum. Le projet déclare désormais dans Android/settings.gradle :
minimumGradleVersion = 9.6.0
Le script compare ce minimum à GradleVersion.current() et échoue explicitement si le Gradle système est trop ancien.
Le projet Android natif ne versionne plus de Gradle Wrapper. Une machine avec Gradle 9.6.0, 9.7.1 ou une version ultérieure compatible utilise directement sa propre version. La version réellement employée est consignée par la gate avec :
(cd Android && gradle --version)
Cette décision concerne uniquement Android/. Les wrappers générés ou contraintes historiques propres au POC Tauri restent locaux à la crate Tauri et ne sont pas réinterprétés.
Politique JDK
Aucun export JAVA_HOME=/usr/lib/jvm/temurin-17-jdk-amd64 n'est imposé au chemin SDL3 natif.
Gradle/AGP utilisent le JDK fourni normalement par le shell ou l'IDE. Le minimum de la chaîne reste Java 17, tandis que la gate doit vérifier le JDK réellement sélectionné. Le JDK 25 installé dans l'environnement utilisateur est donc un candidat normal pour cette validation.
La glue Java Android conserve volontairement :
sourceCompatibility = 17
targetCompatibility = 17
Le JDK de build et le niveau Java de l'application restent deux contrats distincts.
Multi-ABI Snake
game-snake-poc déclare maintenant :
feature snake
ABI arm64-v8a + x86_64
API Rust 21
et :
abiFilters 'arm64-v8a', 'x86_64'
La logique commune sasedev-rust-android.gradle, déjà prouvée en mono-ABI, enregistre une tâche Rust par ABI et remet les deux répertoires jniLibs générés à AGP. L'APK Debug attendu est universal, sans split ABI par défaut.
Reflex devient second consommateur
game-reflex-poc reçoit uniquement la configuration symétrique :
feature reflex
ABI arm64-v8a + x86_64
API Rust 21
puis applique la même logique Gradle commune. Aucun nouveau script, type de tâche, bridge JNI ou chemin d'output n'est introduit.
Cette symétrie confirme que la factorisation appartient bien à Android/gradle/sasedev-rust-android.gradle et non aux modules de jeu.
Suppression du wrapper natif
Un ZIP delta n'efface pas les fichiers d'un jalon précédent. Le manifest :
deltas/0.3.3/0-pre.3.delete.txt
supprime :
Android/gradlew
Android/gradlew.bat
Android/gradle/wrapper/gradle-wrapper.jar
Android/gradle/wrapper/gradle-wrapper.properties
Après extraction du delta à la racine du dépôt, appliquer :
while IFS= read -r path; do
rm -f -- "$path"
done < deltas/0.3.3/0-pre.3.delete.txt
rmdir --ignore-fail-on-non-empty Android/gradle/wrapper
L'audit de distribution traite désormais ces quatre fichiers comme interdits dans le projet Android natif afin d'éviter un retour involontaire à une version Gradle épinglée.
Règles et documentation
Les règles de commandes Android utilisent désormais gradle depuis Android/ et exigent le minimum déclaré par le projet. CMD-051 devient :
(cd Android && gradle :<app>:assembleDebug)
Le plan 0.3.3, la documentation Android et le document de build natif distinguent explicitement :
- Gradle système
>= 9.6.0; - JDK runtime fourni par l'environnement ;
- Java source/target 17 ;
- contraintes Tauri historiques séparées ;
- deux ABI natives productives de cette tranche.
Fichiers
Ajoutés :
deltas/0.3.3/0-pre.3.md
deltas/0.3.3/0-pre.3.delete.txt
history/0.3.3/0-pre.2.md
Modifiés :
Android/README.md
Android/game-reflex-poc/build.gradle
Android/game-snake-poc/build.gradle
Android/settings.gradle
Cargo.toml
docs/development/006-ANDROID_RUST_NATIVE_BUILD.md
docs/plans/003-V0_3_3_ANDROID_NATIVE_MULTI_ABI_PLAN.md
docs/rules/RULES_COMMANDS.md
docs/rules/RULES_VALIDATION_MATRIX.md
scripts/audit_distribution_layout.py
Supprimés par manifest :
Android/gradlew
Android/gradlew.bat
Android/gradle/wrapper/gradle-wrapper.jar
Android/gradle/wrapper/gradle-wrapper.properties
scripts/build_android_rust.py, le code Rust, les manifests Android, CHANGELOG.md et ROADMAP.md restent inchangés.
Validations exécutées dans l'environnement de génération
Le générateur exécute uniquement les audits statiques autorisés après constitution du delta :
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
Aucun build Cargo/Gradle, test ou smoke final n'est attribué au générateur.
Validation utilisateur demandée
Exécuter la gate depuis un shell normal, sans ajouter l'ancien export JAVA_HOME=/usr/lib/jvm/temurin-17-jdk-amd64 :
java -version
printf 'JAVA_HOME=%s\nANDROID_HOME=%s\n' "$JAVA_HOME" "$ANDROID_HOME"
(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:assembleDebug)
(cd Android && gradle :game-reflex-poc:assembleDebug)
La sortie gradle --version doit montrer une version >= 9.6.0 et le JDK effectivement fourni par votre environnement. Une version supérieure au minimum n'est pas une divergence.
Inspection des APK universal
Pour chaque jeu :
for game in game-snake-poc game-reflex-poc; do
APK="$(find "Android/${game}/build/outputs/apk/debug" -maxdepth 1 -type f -name '*.apk' -print -quit)"
test -n "$APK"
printf 'APK=%s\n' "$APK"
unzip -Z1 "$APK" | grep '^lib/' | sort
for abi in arm64-v8a x86_64; do
unzip -Z1 "$APK" | grep -Fx "lib/${abi}/libSDL3.so"
unzip -Z1 "$APK" | grep -Fx "lib/${abi}/libgame_android_entrypoint.so"
done
if unzip -Z1 "$APK" | grep -Eq '^lib/(armeabi-v7a|x86)/'; then
printf '%s\n' "unexpected 32-bit native library in ${game} universal APK" >&2
exit 1
fi
done
L'absence de split est démontrée par un seul APK Debug par module contenant simultanément les bibliothèques ARM64 et x86_64.
Smoke multi-architecture Snake
Après inspection mécanique, installer le même APK Snake sur l'AVD x86_64 puis sur l'appareil ARM64 réel.
AVD connu :
APK="Android/game-snake-poc/build/outputs/apk/debug/game-snake-poc-debug.apk"
adb -s emulator-5554 install -r "$APK"
adb -s emulator-5554 shell am start -n com.sasedev.games.snake/.SnakeActivity
Puis sur l'appareil réel en remplaçant <arm64-serial> par le serial affiché par adb devices -l :
adb -s <arm64-serial> install -r "$APK"
adb -s <arm64-serial> shell am start -n com.sasedev.games.snake/.SnakeActivity
Le smoke attendu est borné : lancement sans erreur de chargement JNI/SDL3 et affichage du jeu. La validation gameplay exhaustive reste hors de ce jalon.
Suite après validation
Si cette gate est propre, 0-pre.4 ouvre le chemin AAB, la vérification 16 KB, la validation du plancher Android disponible et la fermeture de scripts/build_android_rust.py si aucune responsabilité n'y subsiste.
Toute erreur de minimum Gradle, exécution JDK, task wiring x86_64, linkage SDL3, packaging universal ou activation Reflex produit d'abord 0-pre.3.fix.1.