Files
games/deltas/0.1.0/0-pre.7.md
2026-09-16 09:29:19 +02:00

113 lines
3.3 KiB
Markdown

<!-- file: deltas/0.1.0/0-pre.7.md -->
<!-- version: 1 -->
# Delta 0.1.0-0-pre.7
## Base
Base validée : `0.1.0-0-pre.6.fix.1`.
## Validation du delta précédent
Le 2026-09-16, l'utilisateur a validé les gates Rust légères ainsi que les trois builds Android `:common`, Reflex et Snake. Les trois commandes Gradle ont terminé par `BUILD SUCCESSFUL`.
## Objectif
Introduire le `cdylib` Rust Android, le symbole `SDL_main`, le staging `jniLibs` et préparer le premier lancement réel sur appareil ou émulateur.
## Changements
- nouveau crate `crates/apps/game-android-entrypoint` ;
- `crate-type = ["cdylib"]` ;
- features `reflex` et `snake` activées par build applicatif ;
- export contrôlé du symbole `SDL_main` ;
- `engine-v1-sdl` utilise `use-pkg-config` uniquement hors Android ;
- `SaseGameActivity` charge `SDL3` puis `game_android_entrypoint` ;
- script `scripts/build_android_rust.py` pour extraire la bibliothèque SDL3 de l'AAR uniquement pour le linker Rust puis générer `jniLibs` via `cargo-ndk` ;
- `jniLibs` générés exclus de Git ;
- `versionName` Android porté à `0.1.0-0-pre.7`.
## Exception FFI
Le symbole `SDL_main` nécessite un nom ABI stable. Rust 2024 classe `export_name` comme attribut unsafe. Une exception normative unique est donc introduite dans `game-android-entrypoint` : un seul `#[unsafe(export_name = "SDL_main")]`, sans bloc ou fonction unsafe.
## Préflight Android Rust
Vérifier le NDK et les outils :
```bash
cargo ndk --version
rustup target list --installed | grep aarch64-linux-android
```
Si nécessaire :
```bash
rustup target add aarch64-linux-android
cargo install cargo-ndk
```
SDL demande NDK r28c ou ultérieur. `cargo-ndk` détecte normalement le NDK Android Studio ; `ANDROID_NDK_HOME` peut être utilisé pour forcer un chemin.
## Validation Rust hôte
Le delta modifie du Rust :
```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 deltas history
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
```
Test ciblé de la crate d'entrée sans feature :
```bash
cargo test -p game-android-entrypoint --no-default-features
```
## Build natif Android
Depuis la racine :
```bash
python3 scripts/build_android_rust.py reflex
python3 scripts/build_android_rust.py snake
```
Puis :
```bash
cd Android
gradle :game-reflex-poc:assembleDebug
gradle :game-snake-poc:assembleDebug
cd ..
```
## Smoke appareil/émulateur
Avec une cible ADB disponible :
```bash
adb devices
adb install -r Android/game-reflex-poc/build/outputs/apk/debug/game-reflex-poc-debug.apk
adb shell am start -n com.sasedev.games.reflex/.ReflexActivity
```
Puis répéter pour Snake :
```bash
adb install -r Android/game-snake-poc/build/outputs/apk/debug/game-snake-poc-debug.apk
adb shell am start -n com.sasedev.games.snake/.SnakeActivity
```
Le critère de réussite est l'ouverture de la surface SDL sans dialogue `SDL Error`, crash natif ou `UnsatisfiedLinkError`.
## Règle de transition
Si les gates Rust, les deux builds natifs, les APK et les deux smokes appareil/émulateur sont propres, passer automatiquement à `0.1.0-0-pre.8`.
Si une gate échoue à cause du projet, produire `0.1.0-0-pre.7.fix.1`.