import java.util.Properties plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("rust") } val tauriProperties = Properties().apply { val propFile = file("tauri.properties") if (propFile.exists()) { propFile.inputStream().use { load(it) } } } android { signingConfigs { create("release") { storeFile = file("../keystore.jks") storePassword = "agentui123" keyAlias = "agentui" keyPassword = "agentui123" } } compileSdk = 36 namespace = "com.agentui.desktop" defaultConfig { manifestPlaceholders["usesCleartextTraffic"] = "false" applicationId = "com.agentui.desktop" minSdk = 24 targetSdk = 36 versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt() versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0") } buildTypes { getByName("debug") { manifestPlaceholders["usesCleartextTraffic"] = "true" isDebuggable = true isJniDebuggable = true isMinifyEnabled = false packaging { jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so") jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so") jniLibs.keepDebugSymbols.add("*/x86/*.so") jniLibs.keepDebugSymbols.add("*/x86_64/*.so") } } getByName("release") { manifestPlaceholders["usesCleartextTraffic"] = "true" signingConfig = signingConfigs.getByName("release") isMinifyEnabled = false proguardFiles( *fileTree(".") { include("**/*.pro") } .plus(getDefaultProguardFile("proguard-android-optimize.txt")) .toList().toTypedArray() ) } } kotlinOptions { jvmTarget = "1.8" } buildFeatures { buildConfig = true } } rust { rootDirRel = "../../../../" } dependencies { implementation("androidx.webkit:webkit:1.14.0") implementation("androidx.appcompat:appcompat:1.7.1") implementation("androidx.activity:activity-ktx:1.10.1") implementation("com.google.android.material:material:1.12.0") implementation("androidx.work:work-runtime-ktx:2.9.0") implementation("com.squareup.okhttp3:okhttp:4.12.0") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.4") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0") } apply(from = "tauri.build.gradle.kts") // Copy APK after build: local installers/ + network backup // Only the universal signed variant gets copied as agent-ui.apk android.applicationVariants.all { val variant = this variant.outputs.all { val output = this variant.assembleProvider.get().doLast { val src = output.outputFile if (src.exists()) { val localDir = file("../../../../installers") localDir.mkdirs() // Always save versioned copy per variant val localVersioned = File(localDir, "AgentUI-${variant.versionName}-${variant.name}.apk") src.copyTo(localVersioned, overwrite = true) println(">> Copied APK to ${localVersioned.absolutePath}") // agent-ui.apk = only the universal signed build val isUniversal = variant.name.contains("universal", ignoreCase = true) val isSigned = variant.signingConfig != null if (isUniversal && isSigned) { val localFixed = File(localDir, "agent-ui.apk") src.copyTo(localFixed, overwrite = true) println(">> Copied universal signed APK to ${localFixed.absolutePath}") // Network backup val networkDir = File("\\\\Memoria-1\\ActiveBackupforBusiness\\Nucleo v3\\agent-ui-apk") try { if (networkDir.exists() || networkDir.mkdirs()) { val networkFile = File(networkDir, "agent-ui.apk") src.copyTo(networkFile, overwrite = true) println(">> Copied APK to network: ${networkFile.absolutePath}") } else { println(">> WARNING: Network path not available: $networkDir") } } catch (e: Exception) { println(">> WARNING: Failed to copy to network: ${e.message}") } } } } } }