GitHub Actions builds app-release-unsigned.apk. These are for smoke testing only.
- Create a keystore (once):
keytool -genkey -v \
-keystore and-code-release.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias and-code- Add to
~/.gradle/gradle.properties(do not commit):
ANDROID_CODE_STORE_FILE=/absolute/path/and-code-release.jks
ANDROID_CODE_STORE_PASSWORD=...
ANDROID_CODE_KEY_ALIAS=and-code
ANDROID_CODE_KEY_PASSWORD=...- Optional: wire
signingConfigsinapp/build.gradle.ktsreading those properties, then:
./gradlew assembleRelease
# or
./gradlew bundleRelease- Verify:
apksigner verify --print-certs app/build/outputs/apk/release/app-release.apkversionName/versionCodelive inapp/build.gradle.kts- Tag releases as
vX.Y.ZmatchingversionName - Update
CHANGELOG.md(or GitHub Release notes) with user-facing changes
-
./gradlew testDebugUnitTest lintDebug assembleRelease - Manual smoke: local install, chat, permission approve/reject, remote connect
-
THIRD_PARTY_NOTICES.mdstill accurate - No secrets in git history