← Module 04 Module 05 · about 90 min

Ship it: release APK

A debug build only runs on your machine. A release APK runs anywhere and is what the dApp Store and CLOCK IN judges need. Today we sign the app and get a file you can install on any Android device.

1Generate a keystore

You create this. Never commit it. Never put the password in git.

keytool -genkeypair -v -storetype PKCS12 -keystore ~/ship-to-seeker-release.keystore -alias upload -keyalg RSA -keysize 2048 -validity 10000

2Configure signing via env, not a tracked file

Point Gradle at the keystore with properties in ~/.gradle/gradle.properties (user home, not the repo):

SHIP_TO_SEEKER_STORE_FILE=/home/you/ship-to-seeker-release.keystore
SHIP_TO_SEEKER_STORE_PASSWORD=...
SHIP_TO_SEEKER_KEY_ALIAS=upload
SHIP_TO_SEEKER_KEY_PASSWORD=...

Wire those names in android/app/build.gradle release signingConfig. Do not check in keystore.properties or *.jks.

3Build the release APK

cd android && ./gradlew assembleRelease

Or eas build --platform android --profile preview / --profile production. EAS free tier is slow — start it before you sleep. The APK lands under android/app/build/outputs/apk/release/ for a local Gradle build.

4Test the release build

adb install -r android/app/build/outputs/apk/release/app-release.apk

Run every Diagnostics check on this build, not the dev client.

5Common errors

6Checkpoint

You're done when: the APK installs cleanly, all three Diagnostics checks pass, and you have a file you can attach to the CLOCK IN submission.

Ready? → Submission guide