Android release

By default waid build --target android produces a debug APK, which is perfect for testing, but not uploadable to the Play Store. This page covers versioning, signing a release, and building a Play Store bundle.

Debug vs release#

bash
waid build --target android # debug APK (debug-signed)
waid build --target android --release --mode production # signed release (needs a keystore)

Debug is the default; a configured keystore never forces a release. Add --release with an explicit --mode production when you want a signed release using production configuration.

APK vs AAB#

bash
waid build --target android --format apk # APK (default)
waid build --target android --release --mode production --format aab # App Bundle for the Play Store

New Play Store uploads must be an Android App Bundle (--format aab), not an APK. Pair it with --release for an uploadable, signed bundle.

Versioning#

Set the version once at the top level of waid.config.json, a Flutter-style "<name>+<build>" string that applies to every platform. On Android the name becomes versionName and the build number becomes versionCode:

json
{
"version": "1.1.0+2"
}

Every Play Store upload needs a higher build number (versionCode) than the last.

Need an Android-only value? Override the global version with versionCode / versionName under androidBuildProfile; these win for Android only:

json
"androidBuildProfile": {
"packageName": "com.acme.app",
"versionCode": 2,
"versionName": "1.1.0"
}

See App configuration → Version for the full mapping.

Sign a release#

You only touch config + two gitignored files. No Gradle or native code.

Create a keystore (once)#

bash
keytool -genkeypair -v -keystore release.jks -alias upload \
-keyalg RSA -keysize 2048 -validity 10000 -storetype PKCS12

Point the config at it#

In androidBuildProfile:

json
"keystore": "release.jks",
"keyAlias": "upload"

The keystore path and alias aren't secret, so they're safe to commit.

Put passwords in waid.local.properties#

A gitignored file at the project root (waid new scaffolds a waid.local.properties.example to copy):

properties
WAID_ANDROID_KEYSTORE_PASSWORD=your-store-password
WAID_ANDROID_KEY_PASSWORD=your-key-password # omit for a PKCS12 keystore

Build with --release#

WAID loads the passwords automatically:

bash
waid build --target android --release --mode production --format aab

Passwords never go in waid.config.json. The real environment overrides waid.local.properties, so CI can inject the true secrets. Bump versionCode on every upload.

Run on the emulator#

The default build targets arm64-v8a. To also run on the standard Android emulator, add x86_64 to your ABIs:

json
"androidBuildProfile": { "abis": ["arm64-v8a", "x86_64"] }