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.
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:
ANDROID_UPLOAD_KEYSTORE_BASE64ANDROID_UPLOAD_KEY_ALIASANDROID_UPLOAD_STORE_PASSWORDANDROID_UPLOAD_KEY_PASSWORDPublic 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.