
Publication
Documentation
Build & publish
Release builds are one make target away — the env-sync step is baked in, so you never ship a build without the right identifiers, ad IDs, and version stamped in.
Android — App Bundle (recommended)
Google Play now requires an AAB rather than an APK for new apps:
make build-aabOutput:
build/app/outputs/bundle/release/app-release.aabUpload that file to the Play Console under Release → Production → Create new release.
Android — APK
For side-loading or ad-hoc testing:
make build-apkOutput:
build/app/outputs/flutter-apk/app-release.apkiOS — App Store archive
make build-ipaOutput:
build/ios/ipa/*.ipaUpload via Transporter (App Store Connect → Apps → your app → TestFlight or App Store tabs). Or open ios/Runner.xcworkspace in Xcode → Product → Archive → Distribute App.
Version bump
Before every release, bump both:
APP_VERSION_NAME(semver —1.0.1,1.1.0, …)APP_VERSION_CODE(integer — Play requires strictly increasing)
Set them in setup.html → Customizations → General. The sync step patches pubspec.yaml's single version: line, and Flutter propagates that to both stores' expected fields.
Store listings
Both stores require metadata separate from the build:
- App name, subtitle, description
- Screenshots (per device family)
- Feature graphic (Play only)
- Privacy policy URL
- Content rating
Use the assets under assets/store/ as a starting point. The demo store listing on CodeCanyon and the live App Store / Play Store pages are working references you can crib from.
Test builds before you upload
make build-apk
adb install build/app/outputs/flutter-apk/app-release.apkPlay IAP and Play Games only unlock once the build is uploaded to a Play Console track (Internal testing is the fastest), signed with your upload key, and the tester is on the tester list. See In-App Purchase and Play Games.