Android Keystores & Signing
Upload keys and Play App Signing interplay - the EAS-focused cookbook for Android release identity on Expo SDK 57.
Search across all documentation pages
Upload keys and Play App Signing interplay - the EAS-focused cookbook for Android release identity on Expo SDK 57.
Quick-reference recipe card - copy-paste ready.
# First production build - let EAS generate the keystore
eas build --platform android --profile production
# Inspect remote credentials (admin)
eas credentials --platform android
# CI production build
eas build --platform android --profile production --non-interactive// eas.json
{
"build": {
"production": {
"distribution": "store",
"android": {
"buildType": "app-bundle"
}
},
"preview": {
"distribution": "internal",
"android": {
"buildType": "apk"
}
}
}
}// app.config.ts
export default {
expo: {
version: "2.4.0",
android: {
package: "com.example.shopapp",
versionCode: 240001,
},
},
};When to reach for this:
eas build --platform android prompts for keystore generation.assetlinks.json.Step 1 - Enable Play App Signing (new app)
Step 2 - Generate upload credentials with EAS
eas credentials --platform android? What do you want to do? › Set up a new keystore
? Generate a new Android Keystore? › YesEAS stores:
Step 3 - Production AAB build
eas build --profile production --platform android
eas submit --platform android --profile production --latestStep 4 - Register App Links with Play signing fingerprint
# Play Console → Release → App integrity → App signing key certificate
# Copy SHA-256 - NOT the upload key fingerprint// https://shop.example.com/.well-known/assetlinks.json
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.shopapp",
"sha256_cert_fingerprints": ["PLAY_APP_SIGNING_SHA256_HERE"]
}
}
]See Signing & Play App Signing for the full Play Console walkthrough.
| Key | Who holds it | Used for |
|---|---|---|
| Upload key | Your team / EAS | Signing AABs you upload to Play |
| App signing key | Google (Play App Signing) | Signing APKs users download from Play |
# Upload key fingerprint (EAS credentials download - admin only)
eas credentials --platform android
# Debug keystore - local development ONLY
keytool -list -v -keystore ~/.android/debug.keystore \
-alias androiddebugkey -storepass android -keypass android | grep SHA256assetlinks.jsonBrownfield apps already on Play must upload the same upload key EAS will use:
eas credentials --platform android
# Choose: Upload existing keystore
# Provide: .jks path, store password, key alias, key passwordChecklist:
eas build and eas submit to internal track before productioneas credentials --platform android# Admin downloads credentials backup (one-time export) and stores in team vault
eas credentials --platform android
# Remove local .jks from laptops - CI uses EAS remote credentials only{
"build": {
"production": {
"android": {
"buildType": "app-bundle",
"gradleCommand": ":app:bundleRelease"
}
},
"development": {
"android": {
"buildType": "apk",
"withoutCredentials": false
}
}
}
}buildType": "app-bundle" - required for Play productionbuildType": "apk" - preview / internal sideload without PlaywithoutCredentials": true - unsigned debug-style builds only; rare for RN appseas credentials.{
"cli": { "appVersionSource": "remote" },
"build": {
"production": { "autoIncrement": true }
}
}versionCode - always increment on uploadapplicationId and Gradle basicsStack versions: This page was written for React 19.2.3, React Native 0.86.0, and Expo SDK 57 (
expo~57.0.4).
Reviewed by Chris St. John·Last updated Jul 16, 2026