import java.util.Properties plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) alias(libs.plugins.ksp) alias(libs.plugins.hilt) } // Source unique de vérité : VERSION à la racine du dépôt (ex. 0.1.0). val vaultVersion: String = rootProject.file("../VERSION").readText().trim() val vaultVersionCode: Int = run { val parts = vaultVersion.split('.').map { it.toInt() } check(parts.size == 3) { "VERSION doit être major.minor.patch, reçu: $vaultVersion" } parts[0] * 1_000_000 + parts[1] * 1_000 + parts[2] } // Signature release : signing.properties (gitignoré) en local, variables // d'env (SIGNING_*) en CI. Jamais de keystore commité. val signingProps = Properties().apply { val f = file("signing.properties") if (f.exists()) f.inputStream().use { load(it) } } android { namespace = "com.vaultdrop.mobile" compileSdk = 35 defaultConfig { applicationId = "com.vaultdrop.mobile" minSdk = 26 // targetSdk 35 exige des .so alignés en 16K ; les libs précompilées // OpenCV/CameraX sont en 4K (warning de compatibilité sur devices // 16K-pages). On reste en 34 tant qu'elles ne sont pas mises à jour. targetSdk = 34 versionCode = vaultVersionCode versionName = vaultVersion // OpenCV natif : on conserve uniquement les ABIs ciblés // (arm64 = devices, x86_64 = émulateur) pour garder l'APK raisonnable. ndk { abiFilters += listOf("arm64-v8a", "x86_64") } } signingConfigs { create("release") { val storePath = signingProps.getProperty("storeFile") ?: System.getenv("SIGNING_STORE_FILE") if (storePath != null) { storeFile = file(storePath) storePassword = signingProps.getProperty("storePassword") ?: System.getenv("SIGNING_STORE_PASSWORD") keyAlias = signingProps.getProperty("keyAlias") ?: System.getenv("SIGNING_KEY_ALIAS") keyPassword = signingProps.getProperty("keyPassword") ?: System.getenv("SIGNING_KEY_PASSWORD") } } } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro", ) signingConfig = signingConfigs.getByName("release") } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" } buildFeatures { compose = true buildConfig = true } testOptions { unitTests { isIncludeAndroidResources = true } } } dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.lifecycle.viewmodel.compose) implementation(libs.androidx.activity.compose) implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.compose.ui) implementation(libs.androidx.compose.ui.graphics) implementation(libs.androidx.compose.ui.tooling.preview) implementation(libs.androidx.compose.material3) implementation(libs.androidx.compose.material.icons.extended) implementation(libs.androidx.navigation.compose) implementation(libs.androidx.room.runtime) implementation(libs.androidx.room.ktx) ksp(libs.androidx.room.compiler) implementation(libs.hilt.android) ksp(libs.hilt.compiler) implementation(libs.androidx.hilt.navigation.compose) implementation(libs.androidx.hilt.work) ksp(libs.androidx.hilt.compiler) implementation(libs.androidx.work.runtime.ktx) implementation(libs.androidx.camera.camera2) implementation(libs.androidx.camera.lifecycle) implementation(libs.androidx.camera.view) implementation(libs.opencv) implementation(libs.retrofit) implementation(libs.retrofit.converter.moshi) implementation(libs.okhttp) implementation(libs.okhttp.logging) implementation(libs.moshi) implementation(libs.moshi.kotlin) implementation(libs.androidx.security.crypto) implementation(libs.timber) implementation(libs.coil.compose) debugImplementation(libs.androidx.compose.ui.tooling) testImplementation(libs.junit) testImplementation(libs.robolectric) testImplementation(libs.androidx.test.core) testImplementation(libs.androidx.arch.core.testing) testImplementation(libs.kotlinx.coroutines.test) testImplementation(libs.androidx.room.testing) }