0.3.3-0-pre.5
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: Android/README.md -->
|
||||
<!-- version: 12 -->
|
||||
<!-- version: 13 -->
|
||||
|
||||
# Android
|
||||
|
||||
@@ -50,8 +50,12 @@ Le build natif normal utilise directement le Gradle de l'environnement :
|
||||
```bash
|
||||
(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)
|
||||
```
|
||||
|
||||
`bundleRelease` ne requiert aucun secret dans le dépôt. Sans configuration de signature externe, il produit un AAB de validation non destiné à être téléversé tel quel sur un store.
|
||||
|
||||
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
|
||||
@@ -74,7 +78,7 @@ Le module `common` compile contre cet artefact et `SaseGameActivity` étend `org
|
||||
|
||||
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.4`, Snake et Reflex utilisent tous deux le même pipeline commun avec les quatre ABI Android encore supportées par la toolchain retenue :
|
||||
À `0.3.3-0-pre.5`, Snake et Reflex utilisent tous deux le même pipeline commun avec les quatre ABI Android encore supportées par la toolchain retenue :
|
||||
|
||||
```text
|
||||
arm64-v8a
|
||||
@@ -85,17 +89,25 @@ x86
|
||||
|
||||
Les ABI historiques supprimées des toolchains Android modernes, notamment `armeabi`, `mips` et `mips64`, ne font pas partie du contrat. Le support maximal signifie ici toutes les ABI encore supportées simultanément par Android NDK/SDL3/Rust, et non des architectures abandonnées par l'écosystème.
|
||||
|
||||
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 :
|
||||
Chaque variante Android déclenche, pour chaque ABI, un build `cargo ndk` avec exactement la feature du module concerné. La variante Debug utilise le profil Cargo `dev`; la variante Release ajoute `--release`. Les outputs sont placés sous :
|
||||
|
||||
```text
|
||||
Android/<game>/build/generated/sasedevNative/debug/<abi>/jniLibs/<abi>/
|
||||
Android/<game>/build/generated/sasedevNative/<variant>/<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 quatre architectures. Aucune copie durable n'est faite dans `src/main/jniLibs`.
|
||||
AGP fusionne ces sources `jniLibs` générées dans l'APK Debug universal ou dans l'AAB Release. 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.5`; il ne fait plus partie du chemin normal `assembleDebug` de Snake ou Reflex.
|
||||
Le builder historique `scripts/build_android_rust.py` est supprimé en `0-pre.5` : toutes ses responsabilités durables (résolution NDK, extraction SDL3, linkage, sélection de feature, `cargo ndk`, profil release et staging) appartiennent désormais au graphe Gradle.
|
||||
|
||||
## Compatibilité 16 KB et minSdk
|
||||
|
||||
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`.
|
||||
|
||||
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`.
|
||||
|
||||
## Bridge JNI et tactile
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: Android/gradle/sasedev-rust-android.gradle
|
||||
// version: 1
|
||||
// version: 2
|
||||
|
||||
import java.util.Collections
|
||||
import java.util.zip.ZipFile
|
||||
@@ -27,6 +27,9 @@ abstract class BuildSasedevRustAndroidTask extends DefaultTask {
|
||||
@Input
|
||||
abstract Property<String> getNdkVersion()
|
||||
|
||||
@Input
|
||||
abstract Property<Boolean> getReleaseBuild()
|
||||
|
||||
@Internal
|
||||
abstract DirectoryProperty getRepositoryRoot()
|
||||
|
||||
@@ -92,25 +95,32 @@ abstract class BuildSasedevRustAndroidTask extends DefaultTask {
|
||||
def linkFlag = "-Lnative=${linkDirectory}"
|
||||
def rustFlags = inheritedRustFlags ? "${inheritedRustFlags} ${linkFlag}" : linkFlag
|
||||
|
||||
def cargoCommand = [
|
||||
"cargo",
|
||||
"ndk",
|
||||
"-t",
|
||||
selectedAbi,
|
||||
"-o",
|
||||
output.absolutePath,
|
||||
"build",
|
||||
"-p",
|
||||
"game-android-entrypoint",
|
||||
]
|
||||
if (releaseBuild.get()) {
|
||||
cargoCommand.add("--release")
|
||||
}
|
||||
cargoCommand.addAll([
|
||||
"--no-default-features",
|
||||
"--features",
|
||||
selectedFeature,
|
||||
])
|
||||
|
||||
execOperations.exec { spec ->
|
||||
spec.workingDir(repository)
|
||||
spec.environment("ANDROID_NDK_HOME", configuredNdk.absolutePath)
|
||||
spec.environment("CARGO_NDK_PLATFORM", androidApi.get().toString())
|
||||
spec.environment("RUSTFLAGS", rustFlags)
|
||||
spec.commandLine(
|
||||
"cargo",
|
||||
"ndk",
|
||||
"-t",
|
||||
selectedAbi,
|
||||
"-o",
|
||||
output.absolutePath,
|
||||
"build",
|
||||
"-p",
|
||||
"game-android-entrypoint",
|
||||
"--no-default-features",
|
||||
"--features",
|
||||
selectedFeature,
|
||||
)
|
||||
spec.commandLine(cargoCommand)
|
||||
}
|
||||
|
||||
def rustLibrary = new File(runtimeDirectory, "libgame_android_entrypoint.so")
|
||||
@@ -153,7 +163,8 @@ if (!unsupportedAbis.isEmpty()) {
|
||||
}
|
||||
|
||||
androidComponents {
|
||||
onVariants(selector().withBuildType("debug")) { variant ->
|
||||
onVariants(selector().all()) { variant ->
|
||||
def selectedReleaseBuild = variant.buildType == "release"
|
||||
selectedAbis.each { selectedAbi ->
|
||||
def variantSuffix = variant.name.substring(0, 1).toUpperCase() + variant.name.substring(1)
|
||||
def abiSuffix = selectedAbi
|
||||
@@ -177,6 +188,7 @@ androidComponents {
|
||||
abi.set(selectedAbi)
|
||||
androidApi.set(selectedAndroidApi)
|
||||
ndkVersion.set(configuredNdkVersion)
|
||||
releaseBuild.set(selectedReleaseBuild)
|
||||
repositoryRoot.set(repositoryDirectory)
|
||||
outputDirectory.set(layout.buildDirectory.dir("generated/sasedevNative/${variant.name}/${selectedAbi}/jniLibs"))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user