tatmapper-app

Android internal-release runbook

Repository/build gate

cd app
flutter pub get
dart format --output=none --set-exit-if-changed lib test tool
dart run tool/verify_shipping_policy.dart
dart run tool/verify_license_hygiene.dart
dart run tool/verify_android_privacy_policy.dart
dart run tool/verify_support_contact.dart
flutter analyze --no-pub --fatal-warnings
flutter test --no-pub
flutter build apk --release --target-platform android-arm,android-arm64,android-x64
flutter build appbundle --release

The license command must pass. Issue #109 records Bradley C. Peter as the 2025–2026 proprietary copyright holder and the creator/owner of the current logo. Do not upload an artifact if that identity, the private-repository direction, or the third-party notices drift.

CI must also prove that the resolved Flutter/Gradle graphs do not contain ads, billing, ATT, or Sentry and that the merged manifest contains camera permission but no broad storage, audio, internet, advertising-ID, billing permission, or AdMob metadata. It must prove allowBackup=false and package explicit Android 11-and-lower and Android 12-and-newer rules excluding all app-data domains from cloud backup and device transfer.

Validate the bundle with the pinned/verified bundletool, inspect package com.tatmapper.app, API levels, version, permissions, ABIs, and release mapping. Verify the generated plugin registrant matches the reviewed allowlist: CameraX, file picker, Flutter lifecycle support, path provider, and printing only.

The Flutter CI workflow signs its minified release APK with an ephemeral, one-day test certificate and verifies that signature before upload. That makes the exact CI artifact installable for ADB/emulator smoke testing without storing a key. The QA APK includes x86-64 for the API 36 emulator in addition to the two ARM device ABIs. Never upload that test-signed APK to Play or treat it as an owner-signed release.

Owner-controlled signing

Create the upload keystore outside the repository and back it up securely. Use GitHub environment secrets or local untracked properties for the base64 keystore, alias, store password, and key password. Never print them in CI logs or commit them.

Recommended secret names:

Play internal track

  1. Create or confirm the Play Console app and enable Play App Signing.
  2. Upload a signed, version-incremented AAB to an internal test track.
  3. Complete the app content, Data Safety, privacy policy, support contact, content rating, target audience, and store-listing sections from actual beta behavior.
  4. Install through Play on at least one supported physical phone.
  5. Run the QA matrix, inspect the pre-launch report, and attach evidence.

Public and technical support: tatmapper@gmail.com. The Play Console login may use a separate secured Google account.

“AAB builds” means repository/build ready. “Play accepted” requires the signed internal-track install and is not yet verified.