Loading...
Loading...
Android app signing, keystores, and Play App Signing setup. Use when configuring signing for new apps or migrating to Play App Signing.
npx skill4agent add tamtom/gplay-cli-skills gplay-signing-setupkeytool -genkey -v \
-keystore release.keystore \
-alias my-app-key \
-keyalg RSA \
-keysize 2048 \
-validity 10000KEYSTORE_FILE=/path/to/release.keystore
KEYSTORE_PASSWORD=your_keystore_password
KEY_ALIAS=my-app-key
KEY_PASSWORD=your_key_passwordandroid {
signingConfigs {
release {
storeFile file(project.property('KEYSTORE_FILE'))
storePassword project.property('KEYSTORE_PASSWORD')
keyAlias project.property('KEY_ALIAS')
keyPassword project.property('KEY_PASSWORD')
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}android {
signingConfigs {
release {
storeFile file(System.getenv("KEYSTORE_FILE") ?: "release.keystore")
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
}
}
}./gradlew bundleReleasegplay release \
--package com.example.app \
--track internal \
--bundle app-release.aabkeytool -export -rfc \
-keystore release.keystore \
-alias my-app-key \
-file upload_cert.pem# Generate password for encryption
openssl rand -base64 32 > encryption_password.txt
# Export and encrypt private key
keytool -importkeystore \
-srckeystore release.keystore \
-destkeystore encrypted.p12 \
-deststoretype PKCS12 \
-srcalias my-app-key \
-deststorepass $(cat encryption_password.txt)keytool -list -v -keystore release.keystorekeytool -list -v \
-keystore release.keystore \
-alias my-app-key \
| grep Valid# SHA-256 (for Firebase, etc.)
keytool -list -v \
-keystore release.keystore \
-alias my-app-key \
| grep SHA256jarsigner -verify -verbose -certs app-release.aabjarsigner -verify -verbose -certs app-release.apk- name: Decode keystore
run: |
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > release.keystore
- name: Build signed AAB
env:
KEYSTORE_FILE: release.keystore
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
run: |
./gradlew bundleRelease
- name: Clean up keystore
if: always()
run: rm -f release.keystore# Encode keystore to base64
base64 -i release.keystore -o keystore_base64.txt
# Add to GitHub Secrets as KEYSTORE_BASE64keytool -export -rfc \
-keystore new-upload.keystore \
-alias my-app-key \
-file new_upload_cert.pemrelease.keystore# Verify you can use the backup
keytool -list -v -keystore backup/release.keystore~/keystores/
├── app1-release.keystore
├── app2-release.keystore
└── app3-release.keystore# app1/gradle.properties
KEYSTORE_FILE=~/keystores/app1-release.keystore
KEY_ALIAS=app1-key
# app2/gradle.properties
KEYSTORE_FILE=~/keystores/app2-release.keystore
KEY_ALIAS=app2-keyApp Name: My Awesome App
Package: com.example.app
Keystore File: release.keystore (backed up in Dropbox)
Keystore Password: [IN PASSWORD MANAGER]
Key Alias: my-app-key
Key Password: [IN PASSWORD MANAGER]
Certificate Validity: Valid until 2035-02-05
SHA-256 Fingerprint: AB:CD:EF:12:...
Play App Signing: Enabled
Notes: Upload key only, Google manages app signing key