All checks were successful
ci / test (pull_request) Successful in 3m22s
Adds the Android product alongside the existing Linux TUI, in one repo. SDK — crates/onionwire-sdk is a UniFFI facade over the very same `onionwire` crate the TUI runs on. Identity, invite, friend upsert, send/receive, rotate and wipe all delegate; no protocol is reimplemented, so an Android peer and a Linux peer interoperate. It is its own Cargo workspace because Arti's TLS backends are non-additive: the TUI keeps native-tls (OpenSSL), Android needs rustls + static-sqlite (no OpenSSL, no system libsqlite3 in the NDK). android/ — Gradle project. :sdk produces the AAR (Kotlin bindings generated at build time + libonionwire_sdk.so via cargo-ndk), :app is a Kotlin/Compose/M3 messenger depending on :sdk only. minSdk 26, targetSdk/compileSdk 36, INTERNET-only, data in filesDir, backups excluded. Root Cargo.toml grows `native-tls` (default) and `rustls` features so exactly one Arti TLS backend is selected per build graph. The default build is unchanged: same backend, ratatui still a normal dependency, src/tui.rs untouched. Also: Store::self_fingerprint/set_petname + Node wrappers (additive only), scripts/build-android-local.sh, README sections, .gitignore for local SDK paths.
90 lines
2.7 KiB
Kotlin
90 lines
2.7 KiB
Kotlin
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
|
|
|
plugins {
|
|
alias(libs.plugins.android.application)
|
|
alias(libs.plugins.kotlin.android)
|
|
alias(libs.plugins.kotlin.compose)
|
|
}
|
|
|
|
android {
|
|
namespace = "com.siriusdevops.onionwire"
|
|
compileSdk = 36
|
|
|
|
// Same ABI selection as :sdk. JNA ships libjnidispatch.so for several ABIs;
|
|
// without this filter the APK carries native code for ABIs we never built
|
|
// our Rust lib for.
|
|
val onionwireAbis: List<String> = (findProperty("onionwire.abis") as String?)
|
|
?.split(',')?.map(String::trim)?.filter(String::isNotEmpty)
|
|
?: listOf("arm64-v8a")
|
|
|
|
defaultConfig {
|
|
applicationId = "com.siriusdevops.onionwire"
|
|
minSdk = 26
|
|
targetSdk = 36
|
|
versionCode = 1
|
|
versionName = "0.1.0"
|
|
ndk {
|
|
abiFilters += onionwireAbis
|
|
}
|
|
}
|
|
|
|
buildTypes {
|
|
debug {
|
|
// Sideload / device-test builds. Signed with the standard debug key.
|
|
applicationIdSuffix = ".debug"
|
|
versionNameSuffix = "-debug"
|
|
}
|
|
release {
|
|
// Deliberately NOT minified in this card: there is no on-device
|
|
// crash-deobfuscation story yet, and shipping R8 without testing
|
|
// the JNI/uniffi surface on a real device is how you get a
|
|
// mysterious UnsatisfiedLinkError in the field.
|
|
// Enable together with mapping-file upload; keeps already exist in
|
|
// :sdk/consumer-rules.pro.
|
|
isMinifyEnabled = false
|
|
isShrinkResources = false
|
|
// Signed with the debug keystore so the release APK installs.
|
|
// This is NOT a Play upload key — see android/README.md.
|
|
signingConfig = signingConfigs.getByName("debug")
|
|
}
|
|
}
|
|
|
|
compileOptions {
|
|
sourceCompatibility = JavaVersion.VERSION_17
|
|
targetCompatibility = JavaVersion.VERSION_17
|
|
}
|
|
|
|
buildFeatures {
|
|
compose = true
|
|
}
|
|
|
|
packaging {
|
|
resources {
|
|
excludes += "/META-INF/{AL2.0,LGPL2.1}"
|
|
}
|
|
}
|
|
}
|
|
|
|
kotlin {
|
|
compilerOptions {
|
|
jvmTarget.set(JvmTarget.JVM_17)
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
implementation(project(":sdk"))
|
|
|
|
implementation(libs.androidx.core.ktx)
|
|
implementation(libs.androidx.activity.compose)
|
|
implementation(libs.androidx.lifecycle.runtime.compose)
|
|
implementation(libs.androidx.lifecycle.viewmodel.compose)
|
|
implementation(libs.androidx.navigation.compose)
|
|
|
|
implementation(platform(libs.compose.bom))
|
|
implementation(libs.compose.ui)
|
|
implementation(libs.compose.ui.graphics)
|
|
implementation(libs.compose.ui.tooling.preview)
|
|
implementation(libs.compose.material3)
|
|
|
|
debugImplementation(libs.compose.ui.tooling)
|
|
}
|