Linux ist eine hervorragende Plattform für Capacitor Entwicklung. Der Web-Layer besteht nur aus Node-Tooling, Android-Tools laufen nativ, und der Linux-Emulator mit KVM ist oft schneller als derselbe Emulator unter Windows. Die einzige Lücke ist iOS: Xcode gibt es nur auf macOS, daher benötigt man für diesen Teil einen Cloud-Build-Service.
Dieser Guide führt durch ein komplettes Linux-Setup, getestet auf Ubuntu 24.04, Fedora 42 und Arch. Er endet mit einem iOS-Build von Linux aus unter Verwendung von Capgo Build, sodass du beide Stores beliefern kannst, ohne einen Mac zu besitzen.
Was auf Linux funktioniert und was nicht
| Aufgabe | Linux |
|---|---|
| Webentwicklung, Vite, Framework-Tooling | Ja |
cap add android, cap sync, Gradle-Builds |
Ja |
| Android-Emulator | Ja, mit KVM |
| Physisches Android-Gerät via USB | Ja, via udev-Regeln |
| Chrome DevTools Remote Debugging | Ja |
cap add ios, cap sync ios (generieren und kopieren) |
Ja, mit Hinweis auf übersprungene CocoaPods |
| iOS kompilieren, signieren und archivieren | Nein, benötigt macOS. Nutze Capgo Build |
| iOS-Simulator | Nein |
| Safari Web Inspector für iOS WebView | Nein |
Alles in den „Nein“-Zeilen wird in die Cloud oder auf ein echtes iPhone via TestFlight ausgelagert. Das erklären wir am Ende.
1) Node oder Bun installieren
CLI von Capacitor benötigt Node 20 oder neuer. Bun dient als Runtime und Package Manager und ist bei Installationen schneller.
# Bun (recommended)
curl -fsSL https://bun.sh/install | bash
# Or Node via your package manager
# Ubuntu / Debian
sudo apt install -y nodejs npm
# Fedora
sudo dnf install -y nodejs
# Arch
sudo pacman -S nodejs npm
Versionen prüfen:
bun --version
node --version
2) JDK installieren
Capacitor 7 und 8 benötigen JDK 21. Distributionspakete sind okay.
# Ubuntu / Debian
sudo apt install -y openjdk-21-jdk
# Fedora
sudo dnf install -y java-21-openjdk-devel
# Arch
sudo pacman -S jdk21-openjdk
Setzen Sie JAVA_HOME in ~/.bashrc oder ~/.zshrc. Der Pfad hängt von der Distribution ab:
# Ubuntu / Debian
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
# Fedora
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk
# Arch
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk
Falls mehrere JDKs installiert sind, wählt Gradle das, JAVA_HOME auf das gezeigt wird. Eine falsche Version zeigt sich als Unsupported class file major version während cap run android.
3) Installiere das Android SDK
Du hast zwei Optionen. Android Studio bietet dir GUI-Tools. Die Command-Line-Tools allein sind schlanker und reichen zum Build aus.
Option A: Android Studio
Lade das Linux-Tarball von der Android-Studio-Website herunter und entpacke es:
sudo tar -xzf android-studio-*.tar.gz -C /opt
/opt/android-studio/bin/studio.sh
Beim ersten Start installiert der Setup-Wizard das SDK in ~/Android/Sdk.
Capacitors cap open android muss wissen, wo Studio liegt:
export CAPACITOR_ANDROID_STUDIO_PATH=/opt/android-studio/bin/studio.sh
Option B: Nur Command-Line-Tools
mkdir -p ~/Android/Sdk/cmdline-tools
cd ~/Android/Sdk/cmdline-tools
# Download "Command line tools only" for Linux from the Android developer site, then:
unzip commandlinetools-linux-*.zip
mv cmdline-tools latest
Füge das SDK deinem Shell-Profil hinzu:
export ANDROID_HOME=$HOME/Android/Sdk
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/emulator
Installiere, was Capacitor benötigt, und akzeptiere die Lizenzen:
sdkmanager "platform-tools" "platforms;android-36" "build-tools;36.0.0" "emulator"
sdkmanager --licenses
Passe die Plattform-Version an die compileSdkVersion in deinem generierten android/variables.gradle. Capacitor 8 nutzt 36; Capacitor 7 nutzt 35.
4) KVM für den Emulator aktivieren
Ohne KVM ist der Emulator unbrauchbar. Prüfe, ob deine CPU Virtualisierung unterstützt:
egrep -c '(vmx|svm)' /proc/cpuinfo
Ein Ergebnis über 0 bedeutet, dass es unterstützt wird. Installiere KVM und gib deinem User Zugriff:
# Ubuntu / Debian
sudo apt install -y qemu-kvm
# Fedora
sudo dnf install -y qemu-kvm
# Arch
sudo pacman -S qemu-base
sudo usermod -aG kvm $USER
Abmelden und neu anmelden. Erstelle und starte ein Device:
sdkmanager "system-images;android-36;google_apis;x86_64"
avdmanager create avd -n pixel8 -k "system-images;android-36;google_apis;x86_64" -d pixel_8
emulator -avd pixel8
Falls der Emulator Fehlermeldungen bezüglich /dev/kvm Berechtigungen anzeigt, wurde die Gruppenänderung noch nicht übernommen. Starte neu.
5) USB-Zugriff für physische Geräte
Linux erlaubt regulären Usern standardmäßig keinen Zugriff auf USB-Geräte. Füge eine udev-Regel hinzu:
sudo tee /etc/udev/rules.d/51-android.rules > /dev/null <<'EOF'
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="2a70", MODE="0666", GROUP="plugdev"
EOF
sudo udevadm control --reload-rules
sudo usermod -aG plugdev $USER
Die oben genannten Vendor-IDs decken Google, Samsung und OnePlus ab. Finde deine eigene mit lsusb falls dein Phone nicht gelistet ist. Aktiviere USB-Debugging am Phone, schließe es an, bestätige den Fingerprint-Prompt, dann:
adb devices
6) Das Capacitor Projekt erstellen
bun create vite@latest my-app
cd my-app
bun install
bun add @capacitor/core @capacitor/android @capacitor/ios
bun add -d @capacitor/cli
bunx cap init
bun run build
bunx cap add android
bunx cap add ios
cap add ios unter Linux wird eine Warnung ausgegeben, dass CocoaPods nicht verfügbar ist. Das ist normal. Der ios/ Ordner wird trotzdem erstellt und ist das, was Capgo Build später kompiliert.
Auf dem Emulator oder Gerät ausführen:
bunx cap run android
WebView in Chrome debuggen unter chrome://inspect.
7) Release-Builds unter Linux
Android Release-Builds erfolgen komplett lokal. Erstelle einen Keystore mit dem JDKs keytool:
keytool -genkeypair -v -keystore release.jks -keyalg RSA -keysize 2048 -validity 10000 -alias release
Dann builden:
cd android
./gradlew bundleRelease
Die AAB landet in android/app/build/outputs/bundle/release/. Wenn du Signing-Keys lieber nicht auf Laptops speichern möchtest, Capgo Build für Android speichert den Keystore einmal und baut in der Cloud mit demselben CLI, den du für iOS nutzt.
8) iOS von Linux mit Capgo Build
Das ist der Schritt, den Linux allein nicht schafft. Der Workflow:
- Erstelle deine Web-Assets und synchronisiere sie in
ios/. - Speichere deine iOS-Signing-Credentials einmalig.
- Fordere einen Cloud Build an. Capgo kompiliert, signiert und kann zu TestFlight hochladen.
bun run build
bunx cap sync ios
bunx @capgo/cli@latest login
bunx @capgo/cli@latest build init --platform ios
bunx @capgo/cli@latest build request com.example.app --platform ios --build-mode release
build init führt dich durch die Credentials. Unter Linux erstellst du den App Store Connect API Key manuell im Apple-Portal; der iOS-Build-Anleitung zeigt jeden Klick. Für das Distribution Certificate brauchst du Keychain Access nie: Generiere den CSR und .p12 with OpenSSL as described in iOS-Zertifikate und Provisioning Profiles erklärt, oder nutze den iOS-Zertifikatsgenerator.
Logs streamen live in dein Terminal. Der komplette Linux-zu-TestFlight-Flow ist ausführlich beschrieben in Eine iOS-App unter Linux bauen mit Capacitor und Capgo Build.
9) Native Rebuilds mit Live Updates überspringen
Sobald die Native Shells in den Stores sind, bestehen die meisten täglichen Änderungen aus JavaScript, HTML und CSS. Die lassen sich in Sekunden von Linux aus deployen mit Capgo Live Updates:
bunx @capgo/cli@latest init
bun run build
bunx @capgo/cli@latest bundle upload --channel production
Nutze Native Builds nur für Plugin-Änderungen, Berechtigungsänderungen und Capacitor-Upgrades.
Häufige Linux-Probleme
SDK location not found:ANDROID_HOMEist in der Shell, die Gradle ausführt, nicht exportiert. Füge es deinem Profil hinzu und öffne ein neues Terminal, oder erstelleandroid/local.propertiesmitsdk.dir=/home/you/Android/Sdk.Unsupported class file major version: falsches JDK. VerweiseJAVA_HOMEauf JDK 21.- Emulator: schwarzer Bildschirm oder sehr langsam: KVM ist nicht aktiv. Prüfe
ls -l /dev/kvmund deine Gruppenmitgliedschaft. adb deviceszeigtno permissions: udev-Regel fehlt oder wurde nicht neu geladen. Nach dem Neuladen Gerät aus- und wieder einstecken.- Gradle-Daemon läuft ohne Speicher aus: hinzufügen
org.gradle.jvmargs=-Xmx4gzuandroid/gradle.properties. - Wayland und Android Studio Glitches: starte Studio mit
_JAVA_AWT_WM_NONREPARENTING=1wenn Windows leer bleiben.
Zusammenfassung
Linux verarbeitet den kompletten Capacitor Loop für Android und den Web-Layer nativ und oft schneller als andere Desktops. Für iOS generiere das Projekt lokal, synchronisiere deine Assets und überlasse den macOS-Teil dem Capgo Build. Kombiniere das mit Live Updates, und das einzige Mal, dass du an Xcode denkst, ist, wenn Apple die minimale SDK ändert.