feat(android): SDK AAR (UniFFI) + Compose APK, Arti rustls feature split
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.
2026-09-10 18:20:19 -04:00
|
|
|
[package]
|
|
|
|
|
name = "onionwire-sdk"
|
|
|
|
|
version = "0.1.0"
|
|
|
|
|
edition = "2024"
|
|
|
|
|
rust-version = "1.91"
|
|
|
|
|
description = "OnionWire Android/Kotlin SDK: in-process Arti onion transport, Noise IK, identity = ed25519 pubkey."
|
|
|
|
|
license = "MIT"
|
|
|
|
|
publish = false
|
|
|
|
|
|
|
|
|
|
# Standalone workspace on purpose.
|
|
|
|
|
#
|
|
|
|
|
# Arti's TLS backends (`native-tls` vs `rustls`) are non-additive: exactly one
|
|
|
|
|
# may be enabled per feature resolution. The Linux TUI crate keeps native-tls,
|
|
|
|
|
# Android has no OpenSSL in the NDK and needs rustls. Two separate workspaces
|
|
|
|
|
# keep the two resolutions from colliding — this crate path-depends on the
|
|
|
|
|
# root package without joining its feature graph.
|
|
|
|
|
[workspace]
|
|
|
|
|
|
|
|
|
|
[lib]
|
|
|
|
|
name = "onionwire_sdk"
|
|
|
|
|
crate-type = ["cdylib", "lib"]
|
|
|
|
|
|
|
|
|
|
[dependencies]
|
|
|
|
|
onionwire = { path = "../..", default-features = false, features = ["rustls"] }
|
|
|
|
|
# `static-sqlite`: Android has no system libsqlite3 to link against.
|
|
|
|
|
arti-client = { version = "0.46", default-features = false, features = [
|
|
|
|
|
"tokio",
|
|
|
|
|
"onion-service-client",
|
|
|
|
|
"onion-service-service",
|
|
|
|
|
"compression",
|
|
|
|
|
"rustls",
|
|
|
|
|
"static-sqlite",
|
|
|
|
|
] }
|
|
|
|
|
tokio = { version = "1", features = ["rt-multi-thread", "time"] }
|
2026-09-10 22:02:02 -04:00
|
|
|
# rustls 0.23 resolves its provider from its OWN `ring` / `aws-lc-rs` features,
|
|
|
|
|
# never from whichever crypto crates happen to be linked in the graph. Arti
|
|
|
|
|
# pulls rustls in through `tor-rtcompat` with `default-features = false`, so
|
2026-09-10 22:03:40 -04:00
|
|
|
# without this line rustls compiles with zero providers and the first TLS config
|
|
|
|
|
# built from the process default fails at runtime — the "Failed to start /
|
|
|
|
|
# Could not automatically determine the process-level CryptoProvider" screen.
|
|
|
|
|
#
|
|
|
|
|
# `ring`, not `aws-lc-rs`: aws-lc-rs needs CMake and a C toolchain for the NDK
|
|
|
|
|
# and fights the Android cross-compile. The `ring` crate was already in the
|
|
|
|
|
# graph (via `snow`, for Noise) but that is a different thing entirely.
|
|
|
|
|
rustls = { version = "0.23", default-features = false, features = ["ring"] }
|
feat(android): SDK AAR (UniFFI) + Compose APK, Arti rustls feature split
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.
2026-09-10 18:20:19 -04:00
|
|
|
uniffi = { version = "0.32", features = ["cli", "tokio"] }
|
|
|
|
|
thiserror = "2"
|
|
|
|
|
|
|
|
|
|
[[bin]]
|
|
|
|
|
name = "uniffi-bindgen"
|
|
|
|
|
path = "src/bin/uniffi-bindgen.rs"
|