Warum startet Ihre App plötzlich nicht mehr auf Android 12?
\n\nSie haben targetSdkVersion auf 31 oder höher aktualisiert, die APK erstellt, gestartet – und erhalten einen Absturz mit dieser rätselhaften Meldung:
android:exported needs to be explicitly specified for <activity>. \nApps targeting Android 12 and higher are required to specify \nan explicit value for `android:exported` when the corresponding \ncomponent has an intent filter defined.\n\nKommt Ihnen bekannt vor? Ein Blick auf Stack Overflow zeigt: Diese Frage wurde tausendfach aufgerufen. Entwickler sind in Panik, Nutzer ratlos. Aber keine Sorge – Sie müssen Ihr Projekt nicht löschen. In diesem Artikel erklären wir, was es mit android:exported auf sich hat, warum Google die Anforderungen verschärft hat und wie Sie den Fehler schnell mit Kotlin beheben. Los geht's!
Was ist android:exported und wozu braucht man es?
\n\nandroid:exported ist ein Attribut in der AndroidManifest.xml, das steuert, ob andere Apps (oder das System selbst) Ihre Komponente (Activity, Service, BroadcastReceiver oder ContentProvider) starten dürfen. Ist das Attribut auf true gesetzt, ist die Komponente von außen zugänglich. Bei false ist sie nur innerhalb Ihrer App nutzbar.
Vor Android 12 (API 31) war dieses Attribut optional. Wenn Sie es nicht angaben, entschied das System selbst über die Zugänglichkeit:
\n- \n
- Hat eine Activity einen
<intent-filter>, ging das System vonexported = trueaus. \n - Ohne Filter galt
exported = false. \n
Dieses „automatische" Verhalten ist jedoch ein Sicherheitsrisiko. Stellen Sie sich vor: Sie haben eine Activity für den Login entwickelt und versehentlich einen intent-filter hinzugefügt. Jede fremde App könnte diese Activity aufrufen und Tokens stehlen. Deshalb hat Google entschieden: Ab Android 12 müssen Sie android:exported für jede Komponente mit <intent-filter> explizit angeben.
Wie sieht der Fehler in der Praxis aus?
\n\nAngenommen, Sie haben ein einfaches Manifest:
\n\n<activity android:name=".MainActivity">\n <intent-filter>\n <action android:name="android.intent.action.MAIN" />\n <category android:name="android.intent.category.LAUNCHER" />\n </intent-filter>\n</activity>\n\nBei targetSdkVersion = 31 oder höher erhalten Sie einen Fehler beim Kompilieren oder Starten. Die Lösung: Fügen Sie android:exported hinzu:
<activity \n android:name=".MainActivity"\n android:exported="true">\n <intent-filter>\n <action android:name="android.intent.action.MAIN" />\n <category android:name="android.intent.category.LAUNCHER" />\n </intent-filter>\n</activity>\n\nFür die Haupt-Activity, die vom Startbildschirm aus gestartet wird, muss exported auf true gesetzt sein – sonst kann der Launcher sie nicht öffnen.
So beheben Sie den Fehler richtig: Schritt-für-Schritt-Anleitung
\n\nSchritt 1: Öffnen Sie die AndroidManifest.xml
\nSuchen Sie alle <activity>, <service>, <receiver> und <provider>, die einen <intent-filter> besitzen. Fügen Sie für jedes dieser Elemente android:exported hinzu.
Schritt 2: Bestimmen Sie den Wert des Attributs
\nHier eine einfache Regel:
\n- \n
- true – wenn die Komponente von anderen Apps aus zugänglich sein soll (z. B. Activity für Google-Login, BroadcastReceiver für Systemereignisse, Haupt-Activity mit LAUNCHER-Filter). \n
- false – wenn die Komponente nur innerhalb Ihrer App verwendet wird (z. B. eine Activity, die per Button-Klick im eigenen Code geöffnet wird). \n
Schritt 3: Beispiele für verschiedene Szenarien
\n\nSzenario 1: Haupt-Activity (Launcher)