catacomb/android/demo
Luna 1790fd1a22 feat(android): installable demo APK exercising the Rust JNI core
Add android/demo — a minimal, dependency-free app (plain Android Views,
no Gradle/AGP/AndroidX/Compose) that calls the Phase-4 JNI core on-device
and displays the results. build-apk.sh drives the SDK build-tools directly
(aapt2 -> javac -> d8 -> zip -> zipalign -> apksigner), compiling against
android.jar alone so it needs no network and tolerates a very new system
JDK by routing the SDK tools through a JDK <= 21.

The app has three buttons -> platformFromUrl/platformDirName, classifyError,
and vttParse, each calling libcatacomb_core.so and showing the JSON.

Verified on an Android 14 (API 34) x86_64 emulator: installs, launches,
loads the .so, and returns correct JSON on-device
({"dir_name":"channels","display_name":"YouTube","icon":"..."} for a
YouTube URL). Output APK (out/, git-ignored): catacomb-spike-debug.apk,
v2+v3 signed, minSdk 24, native code for arm64-v8a + x86_64.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-04 02:54:00 -07:00
..
src/com/catacomb/spike feat(android): installable demo APK exercising the Rust JNI core 2026-07-04 02:54:00 -07:00
AndroidManifest.xml feat(android): installable demo APK exercising the Rust JNI core 2026-07-04 02:54:00 -07:00
build-apk.sh feat(android): installable demo APK exercising the Rust JNI core 2026-07-04 02:54:00 -07:00
README.md feat(android): installable demo APK exercising the Rust JNI core 2026-07-04 02:54:00 -07:00

Catacomb Rust-core demo APK

A minimal, installable Android app that exercises the Phase-4 Rust JNI core (libcatacomb_core.so) on-device. It's intentionally dependency-free — plain Android Views, no Gradle / AGP / AndroidX / Compose — so it builds against android.jar alone by driving the SDK build-tools directly. This sidesteps AGP's toolchain constraints (e.g. a very new system JDK) and needs no network.

This is not the full Stage-1 app (no yt-dlp-android, no WebView-BotGuard — those are Phases 1/2/3/5 and are device-with-Google-session territory). It's a focused proof that the shared Rust modules run on Android through JNI.

What it does

Three buttons call into Rust and show the JSON that comes back:

  • Detect platformRustCore.platformFromUrl(url) + platformDirName(url)
  • Classify errorRustCore.classifyError(log)
  • Parse sample VTTRustCore.vttParse(sample)

Build

# 1. Build the native libs (arm64-v8a + x86_64) if not already present:
../rust/catacomb_core/build.sh

# 2. Build the signed, installable APK:
./build-apk.sh            # → out/catacomb-spike-debug.apk

Requirements (auto-detected): an Android SDK with platforms;android-34 and build-tools;34.0.0, and a JDK ≤ 21 for the SDK tools (R8/d8 and apksigner choke on bleeding-edge JDKs; the script prefers /usr/lib/jvm/java-17-openjdk, override with TOOL_JAVA_HOME).

The pipeline is: aapt2 link (manifest + resources) → javac (against android.jar) → d8 (dex) → zip in classes.dex + lib/<abi>/*.sozipalignapksigner (debug key). Output is v2+v3 signed, minSdk 24.

Install & run

adb install -r out/catacomb-spike-debug.apk
adb shell am start -n com.catacomb.spike/.MainActivity

Verified on an Android 14 (API 34) x86_64 emulator: the app launches, the .so loads, and the startup probe + button calls return correct JSON ({"dir_name":"channels","display_name":"YouTube","icon":"▶"} for a YouTube URL).

Notes

  • src/com/catacomb/spike/RustCore.java is the Java twin of the Kotlin ../app/.../RustCore.kt; both bind the same Java_com_catacomb_spike_RustCore_* native symbols, so the identical .so serves either. Only the Java one is compiled by this manual build (no kotlinc needed).
  • out/ (APK, .idsig, debug keystore) is git-ignored — rebuild rather than commit binaries.