Présentation du fichier manifeste d'application

Chaque projet d'application doit comporter un fichier AndroidManifest.xml, précisément son nom, à la racine de l'ensemble de sources du projet. Le fichier manifeste décrit les informations essentielles concernant votre application aux outils de compilation et au système d'exploitation Android, ainsi qu'à Google Play.

Entre autres éléments, le fichier manifeste est tenu de déclarer les éléments suivants :

  • Les composants de l'application, y compris l'ensemble des activités, des services les broadcast receivers et les fournisseurs de contenu. Chaque composant doit définir une définition telles que le nom de sa classe Kotlin ou Java. Elle peut également déclarer telles que les configurations d'appareil qu'il peut gérer des filtres d'intent qui décrivent comment démarrer le composant. Vous en saurez plus sur les composants d'application dans une section suivante.
  • Les autorisations dont l'application a besoin pour accéder aux parties protégées du système ou à d'autres applications Il déclare également toutes les autorisations que les autres applications doivent avoir pour accéder au contenu de cette application. Vous trouverez plus d'informations sur les autorisations dans une section suivante.
  • Les fonctionnalités matérielles et logicielles requises par l'application, qui déterminent quels appareils peuvent installer l'application depuis Google Play. Consultez la section suivante pour en savoir plus sur la compatibilité des appareils.

Si vous utilisez Android Studio pour compiler votre application, le fichier manifeste est créé automatiquement, et la plupart des éléments essentiels du fichier manifeste sont ajoutés en tant que lorsque vous créez votre application, en particulier lorsque vous utilisez des modèles de code.

Fonctionnalités du fichier

Les sections suivantes décrivent comment certaines des caractéristiques les plus importantes de votre application sont reflétées dans le fichier manifeste.

Composants de l'application

Pour chaque application, que vous créez dans votre application, Déclarez un élément XML correspondant dans le fichier manifeste:

Si vous sous-classez l'un de ces composants sans le déclarer dans le fichier manifeste , le système ne peut pas le démarrer.

Spécifiez le nom de votre sous-classe avec name. en utilisant la désignation du package complet. Par exemple, un Activity est déclarée comme suit:

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

Toutefois, si le premier caractère de la valeur name est un point, l'espace de noms de l'application, à partir du fichier build.gradle au niveau du module namespace est précédée du nom. Par exemple, si l'espace de noms est "com.example.myapp", le nom d'activité suivant est résolu en com.example.myapp.MainActivity:

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

Pour en savoir plus sur la définition du nom du package ou de l'espace de noms, consultez la section Définir l'espace de noms.

Si vous disposez de composants d'application qui se trouvent dans des sous-packages, comme dans com.example.myapp.purchases, la valeur name doit ajouter les valeurs de sous-package, comme ".purchases.PayActivity", ou utilisez le nom complet du package.

Filtres d'intent

Les activités, les services et les broadcast receivers des applications sont activés par des intents. Un intent est un message défini par Un objet Intent qui décrit une l'action à effectuer, y compris les données concernées, la catégorie composant qui doit effectuer l'action, ainsi que d'autres instructions.

Lorsqu'une application émet un intent pour le système, le système localise un composant d'application qui peut gérer l'intent en fonction des déclarations de filtre d'intent dans le fichier manifeste de chaque application. Le système lance une instance du composant correspondant et transmet l'objet Intent à ce composant. Si plusieurs applications peuvent gérer l'intent, l'utilisateur peut sélectionner celle à utiliser.

Un composant d'application peut avoir un nombre illimité de filtres d'intent (définis avec l'élément <intent-filter>), chacun décrivant une fonctionnalité différente de ce composant.

Pour en savoir plus, consultez le document Intents et filtres d'intent.

Icônes et libellés

Un certain nombre d'éléments du fichier manifeste possèdent des attributs icon et label servant respectivement à afficher une petite icône et à afficher un libellé de texte pour les utilisateurs du composant d'application correspondant.

Dans tous les cas, l'icône et le libellé définis dans un élément parent deviennent les valeurs icon et label par défaut pour tous les éléments enfant. Par exemple, l'icône et le libellé définis dans la section <application> constituent l'icône et le libellé par défaut de chacun des composants de l'application, par exemple toutes les activités.

L'icône et le libellé définis dans l'élément <intent-filter> d'un composant sont présentés à l'utilisateur chaque fois que ce composant est proposé en tant qu'option permettant de répondre à un intent. Par défaut, cette icône est héritée est déclarée pour le composant parent, <activity> ou Élément <application>.

Vous voudrez peut-être changer l'icône d'un filtre d'intent s'il fournit une action unique que vous souhaitez mieux indiquer dans le dans la boîte de dialogue du sélecteur. Pour en savoir plus, consultez Autoriser d'autres applications à démarrer votre activité.

Autorisations

Les applications Android doivent demander l'autorisation d'accéder aux données utilisateur sensibles. comme les contacts et les SMS, ou certaines fonctionnalités du système, comme le la caméra et l'accès à Internet. Chaque autorisation est identifiée par un libellé unique. Par exemple, une application qui doit envoyer des SMS doit comporter la ligne suivante dans le fichier manifeste :

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

En commençant par Android 6.0 (niveau d'API 23), l'utilisateur peut approuver ou refuser certaines autorisations de l'application au moment de l'exécution. Cependant, quelle que soit la version d'Android compatible avec votre application, vous devez déclarer toutes les demandes d'autorisation avec un élément <uses-permission> dans le fichier manifeste. Si l'autorisation est accordée, l'application peut utiliser les fonctionnalités protégées. Si ce n'est pas le cas, ses tentatives d'accès à ces fonctionnalités échouent.

Votre application peut également protéger ses propres composants à l'aide d'autorisations. Elle peut utiliser n'importe quelle autorisation définie par Android, dans android.Manifest.permission, ou une autorisation déclarée dans une autre application. Votre application peut également définir ses propres autorisations. Une nouvelle autorisation est déclarée avec l'élément <permission>.

Pour en savoir plus, consultez la section Autorisations sur Android.

Compatibilité avec les appareils

Le fichier manifeste est également l’endroit où vous pouvez déclarer les types de matériel ou les fonctionnalités logicielles requises par votre application et, par extension, les types d'appareils qu'elle compatibles. Le Google Play Store ne permet pas aux utilisateurs d'installer votre application sur les appareils qui n'offrent pas les fonctionnalités ou la version du système que votre application nécessite.

Plusieurs balises du fichier manifeste définissent les appareils compatibles avec votre application. Voici quelques-unes des plus courantes.

<uses-feature>

Le L'élément <uses-feature> vous permet de déclarer le matériel les fonctionnalités logicielles dont votre application a besoin. Par exemple, si votre application ne peut pas atteindre d'un appareil sans capteur de boussole, vous pouvez déclarer la boussole capteur comme requis avec la balise suivante dans le fichier manifeste:

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

Remarque: Si vous souhaitez que votre application soit disponible sur les Chromebooks, il existe quelques des limitations importantes liées aux fonctionnalités matérielles et logicielles ; à prendre en compte. Pour en savoir plus, consultez Compatibilité du fichier manifeste d'application avec Chromebooks

<uses-sdk>

Souvent, chaque version de plate-forme successive ajoute de nouvelles API non disponibles dans la version précédente. Pour indiquer la version minimale compatible avec votre application, votre fichier manifeste doit inclure la balise <uses-sdk> et son attribut minSdkVersion.

Toutefois, sachez que les attributs de l'élément <uses-sdk> sont remplacées par les propriétés correspondantes ; dans le fichier build.gradle. Ainsi, si vous utilisez Android Studio, spécifiez minSdkVersion et targetSdkVersion à la place:

Groovy

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)
        ...
    }
}

Pour en savoir plus sur le fichier build.gradle, découvrez comment configurer votre compilation.

Pour savoir comment déclarer la compatibilité de votre application avec différents appareils, consultez la section Compatibilité des appareils présentation.

Conventions de fichiers

Cette section décrit les conventions et les règles qui s'appliquent généralement à tous les éléments et attributs du fichier manifeste.

Éléments
Seuls les éléments <manifest> et <application> sont obligatoires. Chacun d'eux ne doit apparaître qu'une seule fois. La plupart des autres éléments peuvent apparaître plusieurs fois ou ne pas apparaître du tout. Cependant, certains d'entre eux doivent être présents pour que le fichier manifeste soit utile.

Toutes les valeurs sont définies via des attributs, et non sous forme de données de caractères dans un élément.

Les éléments de même niveau ne sont généralement pas ordonnés. Par exemple, les éléments <activity>, <provider> et <service> peuvent être placés dans n'importe quel ordre. Il existe deux exceptions clés à cette règle :

  • <activity-alias> doit suivre l'élément <activity>. pour lequel il s'agit d'un alias.
  • L'élément <application> doit être le dernier élément à l'intérieur de Élément <manifest>.
Attributs
Techniquement, tous les attributs sont facultatifs. Cependant, de nombreux attributs doivent être spécifiés pour qu'un élément puisse remplir son objectif. Pour en savoir plus sur les attributs vraiment facultatifs, consultez la documentation de référence. indique les valeurs par défaut.

À l'exception de certains attributs de la racine <manifest> , tous les noms d'attributs commencent par le préfixe android:, comme android:alwaysRetainTaskState. Étant donné que le préfixe est universel, il est généralement omis dans la documentation lorsque vous faites référence à des attributs par nom.

Valeurs multiples
Si vous pouvez spécifier plusieurs valeurs, il est presque toujours préférable de répéter l'élément pour chaque valeur au lieu de regrouper ces valeurs au sein d'un même élément. Par exemple, un filtre d'intent peut répertorier plusieurs actions:
<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>
Valeurs des ressources
Certains attributs ont des valeurs visibles par les utilisateurs, par exemple le titre d'une activité ou l'icône de votre application. La valeur de ces attributs peut diffèrent en fonction de la langue de l'utilisateur ou d'autres configurations de l'appareil (par exemple, propose une taille d'icône différente en fonction de la densité en pixels de l'appareil, de sorte que les valeurs doivent être définies à partir d'une ressource ou d'un thème, et non codées en dur dans fichier manifeste. La valeur réelle peut ensuite varier en fonction des ressources alternatives que vous fournissez pour différentes configurations d'appareil.

Les ressources sont exprimées sous forme de valeurs au format suivant :

"@[package:]type/name"

Vous pouvez omettre le nom package si la ressource est fournie par votre application (y compris si elle est fournie par une dépendance de la bibliothèque, car les ressources de la bibliothèque sont fusionnées avec les vôtres). Le seul autre nom de package valide est android, lorsque vous souhaitez utiliser une ressource du framework Android.

type est un type de ressource, tel que string ou drawable, et name est le nom qui identifie la ressource concernée. Voici un exemple :

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

Pour en savoir plus sur l'ajout de ressources à votre projet, consultez Présentation des ressources de l'application

Pour appliquer à la place une valeur définie dans un thème, le premier caractère doit être ? au lieu de @ :

"?[package:]type/name"

Valeurs de chaîne
Lorsqu'une valeur d'attribut est une chaîne, utilisez des barres obliques inverses doubles. (\\) pour échapper des caractères, comme \\n pour une nouvelle ligne ou \\uxxxx pour un caractère Unicode.

Documentation de référence sur les éléments du fichier manifeste

Le tableau suivant contient des liens vers les documents de référence pour toutes les ressources dans le fichier AndroidManifest.xml.

<action> Ajoute une action à un filtre d'intent.
<activity> Déclare un composant d'activité.
<activity-alias> Déclare un alias pour une activité.
<application> Déclare l'application.
<category> Ajoute un nom de catégorie à un filtre d'intent.
<compatible-screens> Spécifie chaque configuration d'écran avec laquelle l'application est compatible.
<data> Ajoute une spécification de données à un filtre d'intent.
<grant-uri-permission> Indique les sous-ensembles de données d'application auxquels le fournisseur de contenu parent est autorisé à accéder.
<instrumentation> Déclare une classe Instrumentation qui vous permet de surveiller l'interaction d'une application avec le système.
<intent-filter> Spécifie les types d'intents auxquels une activité, un service ou un broadcast receiver peut répondre.
<manifest> Élément racine du fichier AndroidManifest.xml.
<meta-data> Paire nom-valeur pour un élément de données arbitraires supplémentaires pouvant être fournies au composant parent.
<path-permission> Définit le chemin d'accès et les autorisations requises pour un sous-ensemble de données spécifique au sein d'un fournisseur de contenu.
<permission> Déclare une autorisation de sécurité pouvant être utilisée pour limiter l'accès à des composants ou à des fonctionnalités propres à cette application ou à d'autres.
<permission-group> Déclare un nom pour un regroupement logique d'autorisations associées.
<permission-tree> Indique le nom de base d'une arborescence d'autorisations.
<provider> Déclare un composant de fournisseur de contenu.
<queries> Déclare l'ensemble d'autres applications auxquelles votre application a l'intention d'accéder. Pour en savoir plus, consultez le guide sur le filtrage de la visibilité des packages.
<receiver> Déclare un composant broadcast receiver.
<service> Déclare un composant de service.
<supports-gl-texture> Indique un seul format de compression de texture GL compatible avec l'application.
<supports-screens> Indique les tailles d'écran compatibles avec votre application et active le mode de compatibilité pour les écrans plus grands que ceux que votre application prend en charge.
<uses-configuration> Indique les caractéristiques d'entrée spécifiques requises par l'application.
<uses-feature> Déclare une seule fonctionnalité matérielle ou logicielle utilisée par l'application.
<uses-library> Indique une bibliothèque partagée avec laquelle l'application doit être associée.
<uses-native-library> Indique une bibliothèque partagée native fournie par le fournisseur avec laquelle l'application doit être associée.
<uses-permission> Indique une autorisation système que l'utilisateur doit accorder pour que l'application fonctionne correctement.
<uses-permission-sdk-23> Indique qu'une application requiert une autorisation particulière, mais uniquement si elle est installée sur un appareil équipé d'Android 6.0 (niveau d'API 23) ou version ultérieure.
<uses-sdk> Vous permet d'exprimer la compatibilité d'une application avec une ou plusieurs versions de la plate-forme Android à l'aide d'un niveau d'API exprimé sous forme d'entier.

Limites

Les balises suivantes limitent le nombre d'occurrences dans un fichier manifeste:

Nom de la balise Limite
<package> 1000
<meta-data> 1000
<uses-library> 1000

La longueur maximale des attributs suivants est limitée:

Attribut Limite
name 1024
versionName 1024
host 255
mimeType 255

Exemple de fichier manifeste

Le code XML ci-dessous est un exemple simple de AndroidManifest.xml qui déclare deux activités pour l'application.

<?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>