skills/gplay-signing-setup/SKILL.md
Android app signing, keystores, and Play App Signing setup. Use when configuring signing for new apps or migrating to Play App Signing.
npx skillsauth add tamtom/gplay-cli-skills gplay-signing-setupInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when you need to set up or manage app signing for Google Play.
Android apps must be signed with a certificate before upload. Two signing approaches:
keytool -genkey -v \
-keystore release.keystore \
-alias my-app-key \
-keyalg RSA \
-keysize 2048 \
-validity 10000
You'll be prompted for:
KEYSTORE_FILE=/path/to/release.keystore
KEYSTORE_PASSWORD=your_keystore_password
KEY_ALIAS=my-app-key
KEY_PASSWORD=your_key_password
android {
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")
}
}
}
Build and sign AAB with upload key:
./gradlew bundleRelease
Upload AAB to Play Console:
gplay release \
--package com.example.app \
--track internal \
--bundle app-release.aab
Google Play generates app signing key automatically
Download upload certificate:
If your app uses manual signing:
Export upload key:
keytool -export -rfc \
-keystore release.keystore \
-alias my-app-key \
-file upload_cert.pem
Encrypt private key (required by Google):
# 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)
Upload to Play Console:
Download new upload key:
keytool -list -v -keystore release.keystore
keytool -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 SHA256
jarsigner -verify -verbose -certs app-release.aab
jarsigner -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_BASE64
If you lose your upload key:
Generate new keystore (as shown above)
Export certificate:
keytool -export -rfc \
-keystore new-upload.keystore \
-alias my-app-key \
-file new_upload_cert.pem
Contact Google Play support to reset upload key:
release.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-key
Android apps are typically signed with long-lived keys (10-25 years), but if you need to rotate:
Keep this info in your password manager:
App 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
development
App vitals monitoring for crashes, ANRs, performance metrics, and errors via gplay vitals commands. Use when asked to check app stability, crash rates, ANR rates, or performance data from Google Play Console.
development
User and grant management for Google Play Console via gplay users and gplay grants commands. Use when asked to manage developer account users, permissions, or app-level access grants.
development
Beta testing groups and tester management for Google Play closed testing tracks. Use when managing testers and beta groups.
tools
Bulk-localize subscription display names, descriptions, and offer tags across all Google Play locales using gplay. Use when you want to fill in subscription metadata for every language without clicking through Play Console manually.