Android
Le frontend Android natif est un projet Gradle multi-module séparé du workspace Cargo.
Modules
Android/
├── common/
├── game-reflex-poc/
└── game-snake-poc/
common est une Android Library Java qui fournit la frontière commune. Elle compile contre l'AAR SDL3 avec une dépendance compileOnly afin que son propre AAR reste valide.
Chaque module game-* est une application Android indépendante ; il dépend du module common et package directement l'AAR SDL3 dans son APK via implementation.
Toolchain de référence
Le pipeline Android natif 0.3.3 utilise :
- Android Gradle Plugin
9.4.0; - Gradle
>= 9.6.0, résolu depuis l'environnement de développement ; - JDK
>= 17pour exécuter Gradle/AGP, sansJAVA_HOMEimposé par le projet ; - niveau Java source/target
17pour la glue Android ; compileSdk 36;targetSdk 36;minSdk 21;- NDK
28.2.13676358(r28c) ; - SDL3 Android AAR
3.4.16.
Android/settings.gradle déclare minimumGradleVersion = 9.6.0 et refuse explicitement une version plus ancienne. Une version système plus récente reste autorisée et devient la version réellement utilisée pour le build.
Le JDK n'est pas épinglé par le projet Android natif. Le shell/IDE fournit le JDK courant ; la gate doit afficher java -version et gradle --version afin de consigner la combinaison réellement validée. Le POC Tauri Android historique conserve ses propres contraintes de JDK et de wrapper sous sa crate ; elles ne pilotent pas le chemin SDL3 natif.
Commandes Gradle
Depuis la racine du dépôt :
java -version
(cd Android && gradle --version)
Le build natif normal utilise directement le Gradle de l'environnement :
(cd Android && gradle :game-snake-poc:assembleDebug)
(cd Android && gradle :game-reflex-poc:assembleDebug)
Le dépôt ne versionne pas de Gradle Wrapper pour le projet Android natif. Le minimum est un contrat de compatibilité, pas une version exacte imposée à toutes les machines.
SDL3 AAR
L'archive n'est pas vendorizée dans le dépôt. Placer :
SDL3-3.4.16.aar
dans :
Android/libs/
Le module common compile contre cet artefact et SaseGameActivity étend org.libsdl.app.SDLActivity.
Rust Android natif
Le crate game-android-entrypoint produit libgame_android_entrypoint.so. Android/gradle/sasedev-rust-android.gradle transfère au graphe Gradle les responsabilités historiques d'extraction SDL3, de résolution NDK, de cargo ndk, de sélection de feature et de staging jniLibs.
À 0.3.3-0-pre.3, Snake et Reflex utilisent tous deux le même pipeline commun avec deux ABI :
arm64-v8a
x86_64
Chaque assembleDebug doit déclencher, pour chaque ABI, un build cargo ndk avec exactement la feature du module concerné. Les outputs sont placés sous :
Android/<game>/build/generated/sasedevNative/debug/<abi>/jniLibs/<abi>/
├── libSDL3.so
└── libgame_android_entrypoint.so
AGP fusionne ces sources jniLibs générées dans un APK Debug universal contenant les deux architectures. Aucune copie durable n'est faite dans src/main/jniLibs.
scripts/build_android_rust.py reste temporairement comme chemin historique jusqu'au jalon de fermeture 0-pre.4; il ne fait plus partie du chemin normal assembleDebug de Snake ou Reflex.
Bridge JNI et tactile
SaseGameActivity vérifie au démarrage la version du bridge Java/JNI chargé depuis la bibliothèque Rust.
Les touch events standards restent traités via SDL3 et ne transitent pas par JNI.
Packaging des assets
Chaque variante Android enregistre une tâche stage<Variant>SasedevAssets via la Variant API AGP.
La tâche générée compose les sources :
assets/common/ -> assets/common/
assets/<game>/ -> assets/game/
dans un répertoire généré sous Android/<module>/build/generated/sasedevAssets/<variant>/.
Aucune ressource source n'est copiée durablement dans un module Android ou une crate Rust.
Version NDK du projet
Android/gradle.properties définit androidNdkVersion=28.2.13676358.
Gradle utilise cette valeur comme ndkVersion. La tâche Rust Android résout la même version sous ${ANDROID_HOME}/ndk/ ou ${ANDROID_SDK_ROOT}/ndk/ et définit ANDROID_NDK_HOME uniquement pour le sous-processus cargo ndk.
Aucun ANDROID_NDK_HOME global n'est requis ; plusieurs NDK peuvent rester installés côte à côte.