v0.1.0-U (vc=8): Phase U-1 + U-2 — Rust core + rustypipe search
NewPipeExtractor (Java) → strawcore (Rust) migration begins. Phase U:
- U-1: Rust toolchain + UniFFI smoke test
- U-2: rustypipe search via uniffi suspend fun, SearchViewModel swapped
What landed:
- rust/strawcore — UniFFI-exported Rust crate using proc-macros.
Builds for arm64-v8a + armeabi-v7a + x86 + x86_64 via cargo-ndk.
Tokio multi-thread runtime singleton drives rustypipe's async API.
- strawApp/build.gradle.kts — cargoBuildHost + cargoBuild + uniffiBindgen
Gradle Exec tasks chained into the Android build. Generated Kotlin
bindings land in src/main/java/uniffi/strawcore/ (gitignored).
- SearchViewModel.kt — calls uniffi.strawcore.search(query) directly.
NewPipeExtractor still in deps for VideoDetail/Player/Channel paths;
those move to Rust in U-3 / U-4.
- Build chain quirks beat:
* cargo absolute path in Exec tasks (PATH wasn't propagating)
* uniffi-bindgen needs UNSTRIPPED host .so — separate cargoBuildHost
builds a debug-profile host lib to read metadata from
* rustypipe rustls-tls-webpki-roots avoids the openssl-sys
cross-compile tarpit
* rquickjs-sys 'bindgen' feature opted in (no prebuilt Android
bindings ship; build-host has libclang 14)
- build-host runtime install (until Dockerfile catches up):
rustup + 4 Android targets + cargo-ndk + NDK r27c. Persists in
/caches/cargo + /caches/android-sdk via the volume mount.
APK size: 22MB (U-1) → 37MB (U-2). libstrawcore.so 3-5MB per ABI carries
rustypipe + reqwest + tokio + rustls + rquickjs. NewPipeExtractor still
in for now (still drives detail + player + channel + feed), so the
Java half is doubled up. U-5 removes it.
This commit is contained in:
parent
9c4b3f8318
commit
c2c5536729
14 changed files with 432 additions and 29 deletions
46
rust/strawcore/src/lib.rs
Normal file
46
rust/strawcore/src/lib.rs
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
// strawcore — Rust core for the Straw Android app.
|
||||
//
|
||||
// Phase U-1: hello-world smoke test. One exported function, returns a
|
||||
// String so we know JNI + UniFFI marshalling works end-to-end before we
|
||||
// pull in rustypipe.
|
||||
//
|
||||
// Phase U-2+ adds real APIs (search, stream_info, channel_info).
|
||||
|
||||
use std::sync::Once;
|
||||
|
||||
mod error;
|
||||
mod runtime;
|
||||
mod search;
|
||||
|
||||
#[allow(unused_imports)]
|
||||
use runtime::block_on;
|
||||
|
||||
// Re-exports so UniFFI sees the types at the crate root for macro discovery.
|
||||
pub use error::StrawcoreError;
|
||||
pub use search::SearchItem;
|
||||
|
||||
/// Initialize Android logging once. The Kotlin side calls this from
|
||||
/// StrawApp.onCreate() so anything emitted via `log::info!()` shows up in
|
||||
/// `adb logcat -s strawcore`.
|
||||
#[uniffi::export]
|
||||
pub fn init_logging() {
|
||||
static ONCE: Once = Once::new();
|
||||
ONCE.call_once(|| {
|
||||
android_logger::init_once(
|
||||
android_logger::Config::default()
|
||||
.with_max_level(log::LevelFilter::Info)
|
||||
.with_tag("strawcore"),
|
||||
);
|
||||
log::info!("strawcore initialized");
|
||||
});
|
||||
}
|
||||
|
||||
/// Smoke-test entry point — round-trip a string through JNI so we know
|
||||
/// the bridge is working before pulling in rustypipe.
|
||||
#[uniffi::export]
|
||||
pub fn hello_from_rust(name: String) -> String {
|
||||
log::info!("hello_from_rust called with name={}", name);
|
||||
format!("hello {} from rust 🦀 (strawcore v{})", name, env!("CARGO_PKG_VERSION"))
|
||||
}
|
||||
|
||||
uniffi::setup_scaffolding!();
|
||||
Loading…
Add table
Add a link
Reference in a new issue