App-Manifest – Übersicht

Für jedes Anwendungsprojekt muss eine AndroidManifest.xml-Datei mit genau diesem Namen im Stammverzeichnis des Projektquellsatzes vorhanden sein. Die Manifestdatei beschreibt wichtige Informationen zu deiner App für die Android-Build-Tools, das Android-Betriebssystem und Google Play.

Die Manifestdatei muss unter anderem Folgendes deklarieren:

  • Die Komponenten der App, einschließlich aller Aktivitäten, Dienste, Rundfunkempfänger und Inhaltsanbieter. Jede Komponente muss grundlegende Eigenschaften wie den Namen ihrer Kotlin- oder Java-Klasse definieren. Sie können auch Funktionen deklarieren, z. B. welche Gerätekonfigurationen sie verarbeiten kann, und Intent-Filter, die beschreiben, wie die Komponente gestartet werden kann. Weitere Informationen zu App-Komponenten finden Sie im folgenden Abschnitt.
  • Die Berechtigungen, die die App benötigt, um auf geschützte Teile des Systems oder andere Apps zuzugreifen. Außerdem werden darin alle Berechtigungen deklariert, die andere Apps haben müssen, um auf Inhalte aus dieser App zugreifen zu können. Weitere Informationen zu Berechtigungen finden Sie im folgenden Abschnitt.
  • Die für die App erforderlichen Hardware- und Softwarefunktionen, die beeinflussen, welche Geräte die App über Google Play installieren können. Weitere Informationen zur Gerätekompatibilität finden Sie im nächsten Abschnitt.

Wenn Sie Ihre App mit Android Studio erstellen, wird die Manifestdatei für Sie erstellt. Dabei werden die meisten wichtigen Manifestelemente hinzugefügt, insbesondere wenn Sie Codevorlagen verwenden.

Dateifunktionen

In den folgenden Abschnitten wird beschrieben, wie einige der wichtigsten Merkmale Ihrer App in der Manifestdatei widergespiegelt werden.

App-Komponenten

Deklarieren Sie für jede Anwendungskomponente, die Sie in Ihrer Anwendung erstellen, in der Manifestdatei ein entsprechendes XML-Element:

Wenn Sie eine Unterklasse dieser Komponenten erstellen, ohne sie in der Manifestdatei zu deklarieren, kann sie vom System nicht gestartet werden.

Geben Sie den Namen Ihrer abgeleiteten Klasse mit dem Attribut name unter Verwendung der vollständigen Paketbezeichnung an. Die abgeleitete Activity-Klasse wird beispielsweise so deklariert:

<manifest ... >
    <application ... >
        <activity android:name="com.example.myapp.MainActivity" ... >
        </activity>
    </application>
</manifest>

Wenn jedoch das erste Zeichen im Wert name ein Punkt ist, wird dem Namespace der Anwendung aus dem Attribut build.gradle der Datei auf Modulebene namespace dem Namen vorangestellt. Wenn der Namespace beispielsweise "com.example.myapp" ist, wird der folgende Aktivitätsname in com.example.myapp.MainActivity aufgelöst:

<manifest ... >
    <application ... >
        <activity android:name=".MainActivity" ... >
            ...
        </activity>
    </application>
</manifest>

Weitere Informationen zum Festlegen des Paketnamens oder Namespace finden Sie unter Namespace festlegen.

Wenn du App-Komponenten hast, die sich in Unterpaketen wie in com.example.myapp.purchases befinden, muss der Wert name die fehlenden Unterpaketnamen (z. B. ".purchases.PayActivity") hinzufügen oder den voll qualifizierten Paketnamen verwenden.

Intent-Filter

App-Aktivitäten, Dienste und Broadcast-Empfänger werden durch Intents aktiviert. Ein Intent ist eine Nachricht, die durch ein Intent-Objekt definiert wird. Es beschreibt eine auszuführende Aktion, einschließlich der Daten, auf die ausgeführt werden soll, der Kategorie der Komponente, die die Aktion ausführen soll, sowie anderer Anweisungen.

Wenn eine Anwendung einen Intent an das System ausgibt, sucht das System anhand der Deklarierung von Intent-Filtern in der Manifestdatei jeder App nach einer App-Komponente, die den Intent verarbeiten kann. Das System startet eine Instanz der übereinstimmenden Komponente und übergibt das Intent-Objekt an diese Komponente. Wenn mehrere Apps den Intent verarbeiten können, kann der Nutzer auswählen, welche App verwendet werden soll.

Eine Anwendungskomponente kann eine beliebige Anzahl von Intent-Filtern haben (mit dem Element <intent-filter> definiert), die jeweils eine andere Funktion der Komponente beschreiben.

Weitere Informationen finden Sie im Dokument Intents und Intent-Filter.

Symbole und Beschriftungen

Einige Manifestelemente haben die Attribute icon und label, um Nutzern für die entsprechende App-Komponente ein kleines Symbol bzw. ein Textlabel anzuzeigen.

In jedem Fall werden das Symbol und das Label, die in einem übergeordneten Element festgelegt sind, zum Standardwert für icon und label für alle untergeordneten Elemente. Das im Element <application> festgelegte Symbol und Label sind beispielsweise das Standardsymbol und -label für alle Komponenten der App, z. B. für alle Aktivitäten.

Das Symbol und das Label, die in der <intent-filter> einer Komponente festgelegt sind, werden dem Nutzer immer dann angezeigt, wenn diese Komponente als Option zum Ausführen eines Intents angezeigt wird. Standardmäßig wird dieses Symbol von dem Symbol übernommen, das für die übergeordnete Komponente deklariert wurde, also entweder dem Element <activity> oder <application>.

Sie können das Symbol für einen Intent-Filter ändern, wenn dieser eine eindeutige Aktion bietet, die Sie im Auswahldialogfeld besser angeben möchten. Weitere Informationen finden Sie im Hilfeartikel Zulassen, dass andere Apps Ihre Aktivitäten starten.

Berechtigungen

Android-Apps müssen die Berechtigung für den Zugriff auf vertrauliche Nutzerdaten wie Kontakte und SMS oder bestimmte Systemfunktionen wie Kamera und Internetzugang anfordern. Jede Berechtigung ist durch ein eindeutiges Label gekennzeichnet. Beispielsweise muss eine App, die SMS-Nachrichten senden muss, die folgende Zeile im Manifest haben:

<manifest ... >
    <uses-permission android:name="android.permission.SEND_SMS"/>
    ...
</manifest>

Ab Android 6.0 (API-Level 23) können Nutzer einige App-Berechtigungen zur Laufzeit genehmigen oder ablehnen. Du musst jedoch alle Berechtigungsanfragen mit einem <uses-permission>-Element im Manifest deklarieren, unabhängig davon, welche Android-Version deine App unterstützt. Wenn die Berechtigung erteilt wird, kann die App die geschützten Funktionen verwenden. Andernfalls schlägt der Zugriff fehl.

Ihre App kann auch ihre eigenen Komponenten mit Berechtigungen schützen. Sie kann alle von Android definierten Berechtigungen (siehe android.Manifest.permission) oder eine in einer anderen App erklärte Berechtigung verwenden. Sie kann auch eigene Berechtigungen definieren. Mit dem Element <permission> wird eine neue Berechtigung deklariert.

Weitere Informationen findest du unter Berechtigungen unter Android.

Eingeschränkte Gerätekompatibilität

In der Manifestdatei kannst du auch angeben, welche Arten von Hardware- oder Softwarefunktionen für deine App erforderlich sind und mit welchen Gerätetypen deine App kompatibel ist. Nutzer können Ihre App im Google Play Store nur auf Geräten installieren, die nicht die für die App erforderlichen Funktionen oder Systemversion bieten.

Es gibt mehrere Manifest-Tags, die festlegen, mit welchen Geräten deine App kompatibel ist. Im Folgenden finden Sie einige der häufigsten.

<uses-feature>

Mit dem Element <uses-feature> können Sie Hardware- und Softwarefunktionen angeben, die Ihre Anwendung benötigt. Wenn Ihre App beispielsweise auf einem Gerät ohne Kompasssensor die grundlegenden Funktionen nicht erreichen kann, können Sie den Kompasssensor mit dem folgenden Manifest-Tag wie erforderlich deklarieren:

<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>

Hinweis: Wenn du deine App für Chromebooks verfügbar machen möchtest, musst du einige Einschränkungen hinsichtlich der Hardware- und Softwarefunktionen beachten. Weitere Informationen finden Sie unter App-Manifest-Kompatibilität für Chromebooks.

<uses-sdk>

Mit jeder neuen Plattformversion werden häufig neue APIs hinzugefügt, die in der vorherigen Version nicht verfügbar waren. Dein Manifest muss das Tag <uses-sdk> und das Attribut minSdkVersion enthalten, um die Mindestversion anzugeben, mit der deine App kompatibel ist.

Beachten Sie jedoch, dass Attribute im <uses-sdk>-Element durch entsprechende Attribute in der Datei build.gradle überschrieben werden. Wenn Sie also Android Studio verwenden, geben Sie stattdessen die Werte minSdkVersion und targetSdkVersion dort an:

Groovig

android {
    defaultConfig {
        applicationId 'com.example.myapp'

        // Defines the minimum API level required to run the app.
        minSdkVersion 21

        // Specifies the API level used to test the app.
        targetSdkVersion 33
        ...
    }
}

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"

        // Defines the minimum API level required to run the app.
        minSdkVersion(21)

        // Specifies the API level used to test the app.
        targetSdkVersion(33)
        ...
    }
}

Weitere Informationen zur Datei build.gradle finden Sie im Hilfeartikel Build-Konfiguration.

Weitere Informationen dazu, wie du die Unterstützung deiner App für verschiedene Geräte angibst, findest du in der Übersicht zur Gerätekompatibilität.

Dateikonventionen

In diesem Abschnitt werden die Konventionen und Regeln beschrieben, die im Allgemeinen für alle Elemente und Attribute in der Manifestdatei gelten.

Elemente
Nur die Elemente <manifest> und <application> sind erforderlich. Sie dürfen jeweils nur einmal vorkommen. Die meisten anderen Elemente können nicht oder öfter vorkommen. Einige davon müssen jedoch vorhanden sein, damit die Manifestdatei nützlich ist.

Alle Werte werden über Attribute und nicht als Zeichendaten innerhalb eines Elements festgelegt.

Elemente auf derselben Ebene werden in der Regel nicht sortiert. Die Elemente <activity>, <provider> und <service> können beispielsweise in einer beliebigen Reihenfolge platziert werden. Es gibt zwei wichtige Ausnahmen von dieser Regel:

  • Ein <activity-alias>-Element muss dem <activity>-Element folgen, für das es ein Alias ist.
  • Das <application>-Element muss das letzte Element innerhalb des <manifest>-Elements sein.
Attribute
Technisch gesehen sind alle Attribute optional. Allerdings müssen viele Attribute angegeben werden, damit ein Element seinen Zweck erfüllen kann. Für wirklich optionale Attribute finden Sie in der Referenzdokumentation die Standardwerte.

Mit Ausnahme einiger Attribute des Stammelements <manifest> beginnen alle Attributnamen mit dem Präfix android:, z. B. android:alwaysRetainTaskState. Da das Präfix universell ist, wird es in der Dokumentation im Allgemeinen weggelassen, wenn Attribute namentlich referenziert werden.

Mehrere Werte
Wenn mehr als ein Wert angegeben werden kann, wird das Element fast immer wiederholt. Es werden dann nicht mehrere Werte innerhalb eines einzelnen Elements aufgelistet. Für einen Intent-Filter können beispielsweise mehrere Aktionen aufgelistet werden:
<intent-filter ... >
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.INSERT" />
    <action android:name="android.intent.action.DELETE" />
    ...
</intent-filter>
Ressourcenwerte
Einige Attribute haben Werte, die Nutzern angezeigt werden, z. B. der Titel einer Aktivität oder Ihr App-Symbol. Der Wert für diese Attribute kann je nach Sprache oder anderen Gerätekonfigurationen des Nutzers variieren (z. B. um eine andere Symbolgröße basierend auf der Pixeldichte des Geräts anzugeben). Daher sollten die Werte aus einer Ressource oder einem Thema festgelegt werden, anstatt in der Manifestdatei hartcodiert zu sein. Der tatsächliche Wert kann sich dann je nach alternativen Ressourcen ändern, die Sie für verschiedene Gerätekonfigurationen bereitstellen.

Ressourcen werden als Werte im folgenden Format angegeben:

"@[package:]type/name"

Sie können den Namen package weglassen, wenn die Ressource von Ihrer Anwendung bereitgestellt wird (auch wenn sie durch eine Bibliotheksabhängigkeit bereitgestellt wird, da Bibliotheksressourcen in Ihre eigene zusammengeführt werden). Der einzige andere gültige Paketname ist android, wenn Sie eine Ressource aus dem Android-Framework verwenden möchten.

type ist ein Ressourcentyp wie string oder drawable und name ist der Name, der die spezifische Ressource identifiziert. Hier ein Beispiel:

<activity android:icon="@drawable/smallPic" ... >

Weitere Informationen zum Hinzufügen von Ressourcen zu Ihrem Projekt finden Sie unter Übersicht über Anwendungsressourcen.

Wenn Sie stattdessen einen Wert anwenden möchten, der in einem Design definiert ist, muss das erste Zeichen ? anstelle von @ sein:

"?[package:]type/name"

Stringwerte
Wenn ein Attributwert ein String ist, müssen Sie doppelte umgekehrte Schrägstriche (\\) als Escapezeichen verwenden, z. B. \\n für einen Zeilenumbruch oder \\uxxxx für ein Unicode-Zeichen.

Manifestelemente – Referenz

Die folgende Tabelle enthält Links zu den Referenzdokumenten für alle gültigen Elemente in der Datei AndroidManifest.xml.

<action> Fügt einem Intent-Filter eine Aktion hinzu.
<activity> Deklariert eine Aktivitätskomponente.
<activity-alias> Deklariert einen Alias für eine Aktivität.
<application> Deklariert die Anwendung.
<category> Fügt einem Intent-Filter einen Kategorienamen hinzu.
<compatible-screens> Gibt jede Bildschirmkonfiguration an, mit der die Anwendung kompatibel ist.
<data> Fügt einem Intent-Filter eine Datenspezifikation hinzu.
<grant-uri-permission> Gibt die Teilmengen von App-Daten an, für die der übergeordnete Contentanbieter eine Zugriffsberechtigung hat.
<instrumentation> Deklariert eine Instrumentation-Klasse, mit der Sie die Interaktion einer Anwendung mit dem System überwachen können.
<intent-filter> Gibt die Intent-Typen an, auf die eine Aktivität, ein Dienst oder ein Broadcast-Empfänger antworten kann.
<manifest> Das Stammelement der Datei AndroidManifest.xml.
<meta-data> Ein Name/Wert-Paar für ein Element mit zusätzlichen, beliebigen Daten, die an die übergeordnete Komponente geliefert werden können.
<path-permission> Definiert den Pfad und die erforderlichen Berechtigungen für eine bestimmte Teilmenge von Daten innerhalb eines Contentanbieters.
<permission> Deklariert eine Sicherheitsberechtigung, mit der der Zugriff auf bestimmte Komponenten oder Funktionen dieser oder anderer Anwendungen eingeschränkt werden kann.
<permission-group> Deklariert einen Namen für eine logische Gruppierung verwandter Berechtigungen.
<permission-tree> Deklariert den Basisnamen für eine Struktur von Berechtigungen.
<provider> Deklariert eine Contentanbieter-Komponente.
<queries> Deklariert die Gruppe anderer Apps, auf die deine App zugreifen möchte. Weitere Informationen finden Sie im Leitfaden zum Filtern der Paketsichtbarkeit.
<receiver> Deklariert eine Broadcast-Empfänger-Komponente.
<service> Deklariert eine Dienstkomponente.
<supports-gl-texture> Deklariert ein einzelnes GL-Texturkomprimierungsformat, das von der Anwendung unterstützt wird.
<supports-screens> Gibt die Bildschirmgrößen an, die Ihre App unterstützt, und aktiviert den Bildschirmkompatibilitätsmodus für Bildschirme, die größer sind als die von Ihrer App unterstützten Bildschirme.
<uses-configuration> Gibt bestimmte Eingabefunktionen an, die die Anwendung benötigt.
<uses-feature> Deklariert eine einzelne Hardware- oder Softwarefunktion, die von der Anwendung verwendet wird.
<uses-library> Gibt eine gemeinsam genutzte Bibliothek an, mit der die Anwendung verknüpft werden muss.
<uses-native-library> Gibt eine vom Anbieter bereitgestellte native gemeinsam genutzte Bibliothek an, mit der die App verknüpft werden muss.
<uses-permission> Gibt eine Systemberechtigung an, die der Nutzer erteilen muss, damit die App ordnungsgemäß funktioniert.
<uses-permission-sdk-23> Gibt an, dass eine App eine bestimmte Berechtigung anfordert, aber nur, wenn sie auf einem Gerät mit Android 6.0 (API-Level 23) oder höher installiert ist.
<uses-sdk> Hiermit können Sie die Kompatibilität einer App mit einer oder mehreren Versionen der Android-Plattform mithilfe einer API-Level-Ganzzahl ausdrücken.

Beispiel für eine Manifestdatei

Die folgende XML-Datei ist ein einfaches AndroidManifest.xml-Beispiel, das zwei Aktivitäten für die Anwendung deklariert.

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0">

    <!-- Beware that these values are overridden by the build.gradle file -->
    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- This name is resolved to com.example.myapp.MainActivity
             based on the namespace property in the build.gradle file -->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".DisplayMessageActivity"
            android:parentActivityName=".MainActivity" />
    </application>
</manifest>