8a0b7832c0
AdbClient wraps the bundled libadb.so (useLegacyPackaging -> exec from nativeLibraryDir, HOME/TMPDIR overridden, adb key injected into BuildConfig from ~/.android at build time and never committed). ShizukuProvisioner: on each BLE+WiFi connect it enables ADB-over-WiFi via Mercury, connects with mDNS fallback, pushes the Shizuku starter and runs it; runs once per BLE session, does not relaunch GlassesApp when the WS channel is already up, and exposes runShell() for arbitrary commands. DebugReceiver (DUMP) + am start --ez provision for diagnostics. Protocol: ShizukuStatus(running/granted) + RequestShizukuStatus; glasses push it on connect and on Shizuku state change, using a passive probe() that never shows a permission dialog. Glasses kill-guard now recreates its UserService when the Shizuku binder dies instead of spamming DeadObjectException. Mercury: brightness disables auto-brightness first (was silently ignored), BLE auto-connect loop retries every 6s (fixes 'searches then stops'). New phone section 'Экран очков' with wake/sleep via adb (input keyevent 224/223).
102 lines
3.7 KiB
Kotlin
102 lines
3.7 KiB
Kotlin
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<Exec>("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)
|
|
}
|