Establish Android CI, static analysis, tests, and reproducible native build gates #94

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

Goal

Make the Android application and every bundled Rust ABI continuously buildable, reviewable, and testable before feature work expands.

Scope

  • Add CI jobs for Gradle dependency verification, Kotlin compilation, unit tests, Android Lint, formatting/static analysis, Compose tests, and release AAB assembly.
  • Build and test the Rust Android bridge and selected ABIs with the pinned NDK; retain the repository-required Rust formatting, warnings, Clippy, and workspace tests.
  • Run emulator instrumentation for the supported minimum/current SDK matrix and x86_64 native bridge; add a physical-arm64 smoke-test checklist for security and camera flows that emulators cannot prove.
  • Verify UniFFI binding freshness/checksums, ABI contents, release stripping/debug-symbol archive, 16 KB page alignment, manifest permissions, backup rules, exported components, and absence of forbidden libraries/process execution.
  • Add deterministic fakes/fixtures for storage pages, clocks, errors, cancellation, biometric results, and process recreation. Never place production-like secrets in CI artifacts.
  • Add dependency/license/SBOM review and fail on known-disallowed dependency classes from #88.
  • Define baseline performance measurements for cold start/native load, large store browsing/search, TOTP warm load, and editor interactions; add Macrobenchmark/Baseline Profiles only after representative screens exist.
  • Keep signing and Play credentials out of general CI; distribution uses a separately protected release workflow.

Acceptance criteria

  • A clean CI run produces tested debug APKs and an unsigned/release-test AAB for every selected ABI.
  • Android and Rust warnings are treated as errors under documented, non-flaky gates.
  • Native packaging, page-size, binding mismatch, backup/exported-component, and architecture-boundary audits fail deterministically.
  • Test reports contain no decrypted entry, OTP URI, key armor, token, or passphrase.
  • Required local commands and the physical-device-only validation matrix are documented.

Depends on #88, the Gradle scaffold, and Rust/UniFFI packaging issues. Part of #87.

## Goal Make the Android application and every bundled Rust ABI continuously buildable, reviewable, and testable before feature work expands. ## Scope - Add CI jobs for Gradle dependency verification, Kotlin compilation, unit tests, Android Lint, formatting/static analysis, Compose tests, and release AAB assembly. - Build and test the Rust Android bridge and selected ABIs with the pinned NDK; retain the repository-required Rust formatting, warnings, Clippy, and workspace tests. - Run emulator instrumentation for the supported minimum/current SDK matrix and x86_64 native bridge; add a physical-arm64 smoke-test checklist for security and camera flows that emulators cannot prove. - Verify UniFFI binding freshness/checksums, ABI contents, release stripping/debug-symbol archive, 16 KB page alignment, manifest permissions, backup rules, exported components, and absence of forbidden libraries/process execution. - Add deterministic fakes/fixtures for storage pages, clocks, errors, cancellation, biometric results, and process recreation. Never place production-like secrets in CI artifacts. - Add dependency/license/SBOM review and fail on known-disallowed dependency classes from #88. - Define baseline performance measurements for cold start/native load, large store browsing/search, TOTP warm load, and editor interactions; add Macrobenchmark/Baseline Profiles only after representative screens exist. - Keep signing and Play credentials out of general CI; distribution uses a separately protected release workflow. ## Acceptance criteria - A clean CI run produces tested debug APKs and an unsigned/release-test AAB for every selected ABI. - Android and Rust warnings are treated as errors under documented, non-flaky gates. - Native packaging, page-size, binding mismatch, backup/exported-component, and architecture-boundary audits fail deterministically. - Test reports contain no decrypted entry, OTP URI, key armor, token, or passphrase. - Required local commands and the physical-device-only validation matrix are documented. Depends on #88, the Gradle scaffold, and Rust/UniFFI packaging issues. Part of #87.
hugo added this to the 06 - Implement an Android version of the software milestone 2026-08-17 19:10:21 +00:00
hugo added the enhancement label 2026-08-17 19:10:21 +00:00
Sign in to join this conversation.