plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.serialization) } // adb-ключ рабочей машины (уже авторизован на очках) зашивается в APK, чтобы // телефон мог подключиться к очкам по wireless-debugging без сопряжения. // Ключ НЕ коммитится — берётся из ~/.android при сборке. fun String.toBuildConfigString(): String = "\"" + replace("\\", "\\\\").replace("\"", "\\\"").replace("\r", "").replace("\n", "\\n") + "\"" val adbKeyFile = File(System.getProperty("user.home"), ".android/adbkey") val adbPubKeyFile = File(System.getProperty("user.home"), ".android/adbkey.pub") val adbPrivateKeyConst = if (adbKeyFile.exists()) adbKeyFile.readText().trim().toBuildConfigString() else "\"\"" val adbPublicKeyConst = if (adbPubKeyFile.exists()) adbPubKeyFile.readText().trim().toBuildConfigString() else "\"\"" android { namespace = "pw.binom.rayneovm.phone" compileSdk = 37 defaultConfig { applicationId = "pw.binom.rayneovm.phone" minSdk = 26 targetSdk = 37 versionCode = 1 versionName = "0.1.0" buildConfigField("String", "ADB_PRIVATE_KEY", adbPrivateKeyConst) buildConfigField("String", "ADB_PUBLIC_KEY", adbPublicKeyConst) } buildTypes { release { isMinifyEnabled = false } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } buildFeatures { compose = true buildConfig = true } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } // libadb.so — исполняемый бинарник adb, а не shared-библиотека. Чтобы его можно // было запускать из nativeLibraryDir (единственное разрешённое место на W^X), // включаем legacy-packaging: jniLibs распаковываются на диск при установке. jniLibs { useLegacyPackaging = true } } } kotlin { compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) } } dependencies { implementation(project(":shared")) implementation(libs.kotlinx.coroutines.android) implementation(libs.kotlinx.serialization.json) implementation(libs.androidx.core.ktx) implementation(libs.androidx.activity.compose) implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.lifecycle.viewmodel.compose) implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.compose.ui) implementation(libs.androidx.compose.foundation) implementation(libs.androidx.compose.material3) implementation(libs.androidx.compose.material.icons) implementation(libs.androidx.navigation.compose) implementation(libs.shizuku.api) implementation(libs.mercury.library) implementation(libs.mercury.transport) implementation(libs.mercury.binocular) implementation(libs.mercury.shizuku) } // Установка APK на телефон. // Запуск: ./gradlew :app-phone-vm:installPhone tasks.register("installPhone") { group = "deploy" description = "Install PhoneApp APK на телефон (serial: AXGL024B05001337)" dependsOn("assembleDebug") val serial = "AXGL024B05001337" val apk = layout.buildDirectory.file("outputs/apk/debug/app-phone-vm-debug.apk") commandLine("adb", "-s", serial, "install", "-r", apk.get().asFile.absolutePath) }