Scaffold the Android Gradle project and enforce module boundaries #89

Open
opened 2026-08-17 19:10:17 +00:00 by hugo · 0 comments
Owner

Goal

Create the native Android project structure that will host the Kotlin application without weakening IronStorage's Rust-owned domain boundary.

Scope

  • Add an android/ Gradle build using Gradle Kotlin DSL, a version catalog, the Android application plugin, Kotlin, Compose, Hilt/KSP, and reproducible wrapper/toolchain settings.
  • Use a single-activity Compose application and separate modules where the boundary is useful: application/navigation, feature UI modules, Android platform adapters, and the generated Rust bridge. Avoid a module-per-screen architecture.
  • Give the production application the stable package/application ID de.rfc1437.ironstorage; derive service/test IDs without changing the main identity.
  • Define build types, signing placeholders, manifest merging, resources, localization structure, ProGuard/R8 rules, native debug symbols, and deterministic version metadata without committing signing secrets.
  • Enforce allowed dependency direction: Compose features depend on an Android-facing repository/facade; only that facade depends on generated UniFFI types; platform adapters implement narrow OS contracts; no feature module reads the password-store filesystem.
  • Pin stable dependencies through the version catalog and enable dependency verification/locking where supported.
  • Add debug fixtures/fakes for every shell state so UI development does not require real secret material.

Libraries and tools

Android Gradle Plugin, Kotlin Gradle plugin, Compose BOM/Material 3, Activity Compose, Lifecycle, Navigation, Hilt with KSP, Gradle version catalogs, Android Lint, and the NDK plugin/toolchain settings required by the Rust packaging issue.

Acceptance criteria

  • A clean checkout can configure and assemble a placeholder debug APK with no externally installed helper process at application runtime.
  • Package IDs, min/target SDK policy, namespace, modules, dependency direction, and build types match #88.
  • Release configuration contains no development endpoint, credential, key, or signing material.
  • Android feature modules cannot directly depend on Rust implementation crates, filesystem/Git libraries, or competing crypto/OTP libraries.
  • Gradle configuration is cacheable and CI-ready, and generated/native outputs stay out of source control unless explicitly reviewed as release artifacts.

Depends on #88. Part of #87.

## Goal Create the native Android project structure that will host the Kotlin application without weakening IronStorage's Rust-owned domain boundary. ## Scope - Add an `android/` Gradle build using Gradle Kotlin DSL, a version catalog, the Android application plugin, Kotlin, Compose, Hilt/KSP, and reproducible wrapper/toolchain settings. - Use a single-activity Compose application and separate modules where the boundary is useful: application/navigation, feature UI modules, Android platform adapters, and the generated Rust bridge. Avoid a module-per-screen architecture. - Give the production application the stable package/application ID `de.rfc1437.ironstorage`; derive service/test IDs without changing the main identity. - Define build types, signing placeholders, manifest merging, resources, localization structure, ProGuard/R8 rules, native debug symbols, and deterministic version metadata without committing signing secrets. - Enforce allowed dependency direction: Compose features depend on an Android-facing repository/facade; only that facade depends on generated UniFFI types; platform adapters implement narrow OS contracts; no feature module reads the password-store filesystem. - Pin stable dependencies through the version catalog and enable dependency verification/locking where supported. - Add debug fixtures/fakes for every shell state so UI development does not require real secret material. ## Libraries and tools Android Gradle Plugin, Kotlin Gradle plugin, Compose BOM/Material 3, Activity Compose, Lifecycle, Navigation, Hilt with KSP, Gradle version catalogs, Android Lint, and the NDK plugin/toolchain settings required by the Rust packaging issue. ## Acceptance criteria - A clean checkout can configure and assemble a placeholder debug APK with no externally installed helper process at application runtime. - Package IDs, min/target SDK policy, namespace, modules, dependency direction, and build types match #88. - Release configuration contains no development endpoint, credential, key, or signing material. - Android feature modules cannot directly depend on Rust implementation crates, filesystem/Git libraries, or competing crypto/OTP libraries. - Gradle configuration is cacheable and CI-ready, and generated/native outputs stay out of source control unless explicitly reviewed as release artifacts. Depends on #88. Part of #87.
hugo added this to the 06 - Implement an Android version of the software milestone 2026-08-17 19:10:17 +00:00
hugo added the enhancement label 2026-08-17 19:10:17 +00:00
Sign in to join this conversation.