Zum Hauptinhalt springen

Android Release Builds ohne Android Studio auf Linux, Windows und CI

Erstelle ein signiertes Android AAB für eine Capacitor App nur über die Kommandozeile: keytool keystore, Gradle im Terminal, Play Console Service Account und eine Capgo Build Cloud-Alternative, die den Keystore von Laptops fernhält.

Android Release Builds ohne Android Studio auf Linux, Windows und CI

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 -version gibt 21 aus).
  • Android-Kommandozeile SDK mit platform-tools, build-tools und 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_HOME exportiert, oder android/local.properties mit sdk.dir=....
  • Eine Capacitor-App mit android/ erstellt von bunx 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: setzen ANDROID_HOME oder erstellen android/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 *.jks als 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 ~/.gradle und den SDK vom Defender aus und halte das Projekt auf einem kurzen lokalen Pfad.
  • Out of memory bei Gradle: hinzufügen org.gradle.jvmargs=-Xmx4g zu android/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.

Live-Updates für Capacitor-Apps

Wenn ein Bug im Web-Layer live ist, liefere den Fix über Capgo aus, statt Tage auf die App-Store-Freigabe zu warten. Nutzer bekommen das Update im Hintergrund, während native Änderungen im normalen Review-Prozess bleiben.

Neues aus unserem Blog

Capgo gibt dir die besten Insights, um eine wirklich professionelle Mobile App zu erstellen.