Android Studio ist eine gute IDE, aber sie ist nicht zwingend erforderlich, um einen Store-ready Android Build zu erstellen. Der generierte android/ Ordner in einem Capacitor Projekt enthält einen Gradle Wrapper, der Builds und Signings von jedem Terminal aus ermöglicht. Das ist wichtig für Linux-Server ohne Display, für Windows-Rechner, auf denen Studio langsam ist, und für CI.
In diesem Guide erstellst du ein signiertes AAB nur über die Kommandozeile und lernst die Cloud-Variante mit Capgo Build kennen – für Teams, die keine Keystores auf Laptops haben wollen.
Voraussetzungen
- JDK 21 (
java -versiongibt 21 aus). - Android-Kommandozeile SDK mit
platform-tools,build-toolsund der passenden Plattform für deine Capacitor-Version (API 36 für Capacitor 8, API 35 für Capacitor 7). Die Linux-Anleitung und Windows-Anleitung erklären die Installation. ANDROID_HOMEexportiert, oderandroid/local.propertiesmitsdk.dir=....- Eine Capacitor-App mit
android/erstellt vonbunx cap add android.
1) Signing-Keystore erstellen
keytool ist auf jeder Plattform Teil des JDK:
keytool -genkeypair -v \
-keystore release.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias release
Beantworte die Prompts und wähle ein Store-Passwort sowie ein Key-Passwort. Speichere die Datei und beide Passwörter sofort in deinem Passwort-Manager oder Secret Vault. Committe niemals release.jks.
Aktiviere Play App Signing, wenn du die App in der Play Console erstellst. Google behält dann den finalen Signing-Key, und dein Keystore wird zu einem Upload-Key, der bei Verlust zurückgesetzt werden kann.
2) Gradle für das Signing konfigurieren
Halte Secrets fern von build.gradle. Erstelle android/keystore.properties (gitignored):
storeFile=/absolute/path/to/release.jks
storePassword=your-store-password
keyAlias=release
keyPassword=your-key-password
Dann referenzierst du es in android/app/build.gradle:
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file("keystore.properties")
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
signingConfigs {
release {
if (keystorePropertiesFile.exists()) {
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
}
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
}
}
}
Füge android/keystore.properties und *.jks zu .gitignore.
3) Version erhöhen
Google Play lehnt Uploads mit einem versionCode den es zuvor schon gesehen hat. Bearbeite android/app/build.gradle:
defaultConfig {
versionCode 12
versionName "1.4.0"
}
Teams leiten ihn meist versionCode aus CI-Run-Nummern oder aus der Git-Commit-Anzahl ab, um manuelle Änderungen zu vermeiden.
4) AAB im Terminal bauen
bun run build
bunx cap sync android
cd android
./gradlew bundleRelease
Unter Windows verwende .\gradlew.bat bundleRelease. Das signierte Bundle wird in android/app/build/outputs/bundle/release/app-release.aab.
Brauchst du eine APK für direkte Installs via adb? ./gradlew assembleRelease erzeugt app-release.apk unter outputs/apk/release/. Installiere sie mit adb install; der adb install Anleitung deckt auch Edge Cases ab.
5) Signatur überprüfen
$ANDROID_HOME/build-tools/36.0.0/apksigner verify --print-certs app/build/outputs/apk/release/app-release.apk
Für ein AAB: jarsigner -verify -verbose app-release.aab bestätigt die Signatur und den Zertifikats-Fingerprint. Vergleiche den SHA-256 mit dem in der Play Console unter App-Integrität.
6) Per CLI zu Google Play hochladen
Der manuelle Upload über die Play Console funktioniert. Für die Automatisierung erstelle ein Service Account in Google Cloud, gib ihm Zugriff in der Play Console unter Nutzer und Berechtigungen und lade den JSON-Key herunter. Dann kannst du mit dem Google Play Developer API oder Tools wie fastlane supply hochladen:
bundle exec fastlane supply --aab android/app/build/outputs/bundle/release/app-release.aab \
--track internal --json_key play-service-account.json --package_name com.example.app
Der erste Upload einer neuen App muss manuell in der Play Console erfolgen; API akzeptiert nur Builds für bereits vorhandene Apps.
7) Die Cloud-Alternative: Capgo Build für Android
Alles oben funktioniert, hinterlässt aber auf jeder Build-Maschine einen Keystore. Capgo Build bewahrt den Keystore in einem verschlüsselten Vault auf und baut aus dem vorbereiteten android/ Projekt, das du hochlädst, und kann das AAB in einen Play-Track pushen.
Credentials einmalig speichern:
bunx @capgo/cli@latest build credentials save --platform android \
--keystore ./release.jks \
--keystore-alias "release" \
--keystore-key-password "key-password" \
--keystore-store-password "store-password" \
--play-config ./play-service-account.json
Oder lass dich bunx @capgo/cli@latest build init --platform android anleiten. Dann ist jedes Release:
bun run build
bunx cap sync android
bunx @capgo/cli@latest build request com.example.app --platform android --build-mode release
Logs werden im Terminal gestreamt. Füge --output-upload hinzu, um einen Download-Link für das AAB oder APK zu bekommen, und --ai-analytics um fehlgeschlagene Builds automatisch erklären zu lassen. Derselbe Befehl läuft auf Windows, Linux, macOS und in der CI. Ein GitHub Actions-Beispiel findest du im Android Build Guide.
Da Capgo nur das vorbereitete native Projekt erhält, bleiben private npm Registries und Web-Build-Secrets in deiner Umgebung.
8) Keine Rebuilds mehr bei Web-Änderungen
Für Plugin-, Permission-, Icon- und Capacitor Upgrades ist ein signierter Native Build erforderlich. Für alles in dist/, Capgo Live Updates pushen Sie das neue Web-Bundle direkt an die installierten Apps:
bunx @capgo/cli@latest bundle upload --channel production
Das erspart Ihnen die meisten Gradle-Runs pro Woche.
Fehlerbehebung
SDK location not found: setzenANDROID_HOMEoder erstellenandroid/local.properties.Keystore was tampered with, or password was incorrect: falsches Store-Passwort oder die Datei wurde durch eine CRLF-Konvertierung in Git beschädigt. Markieren Sie*.jksals Binary in.gitattributes, falls es versioniert werden muss – was es eigentlich nicht sollte.Unsupported class file major version: Das JDK ist neuer oder älter als Version 21.- Play lehnt das AAB ab: „signed with a different key“Play App Signing erwartet deinen Upload-Key. Nutze den in der Play Console registrierten Keystore oder fordere einen Reset des Upload-Keys an.
- Build ist unter Windows langsam: schließe
~/.gradleund den SDK vom Defender aus und halte das Projekt auf einem kurzen lokalen Pfad. - Out of memory bei Gradle: hinzufügen
org.gradle.jvmargs=-Xmx4gzuandroid/gradle.properties.
Zusammenfassung
Ein Capacitor Android-Release benötigt ein JDK, das SDK und den Gradle Wrapper, nicht Android Studio. Erstelle den Keystore mit keytool, signiere über keystore.properties, baue mit bundleRelease, und lade es mit dem Play API hoch. Wenn du den Keystore von Laptops fernhalten und denselben Befehl auf jedem OS nutzen willst, übernimmt Capgo Build das Signing und den Upload aus dem vorbereiteten Projekt.