Panoramica del file manifest dell'app

Ogni progetto di app deve avere un file AndroidManifest.xml, con lo stesso scopo nome, alla radice del set di origini del progetto. Il file manifest descrive informazioni essenziali informazioni sulla tua app agli strumenti di sviluppo Android, al sistema operativo Android e su Google Play.

Tra le tante altre cose, il file manifest deve dichiarare quanto segue:

  • I componenti dell'app, tra cui tutte le attività, i servizi broadcast receiver e fornitori di contenuti. Ogni componente deve definire come il nome della relativa classe Kotlin o Java. Può anche dichiarare quali le configurazioni dei dispositivi che è in grado di gestire filtri per intent che descrivono come è possibile avviare il componente. Scopri di più sui componenti delle app nelle sezioni seguenti.
  • Le autorizzazioni necessarie all'app per accedere a parti protette del sistema o ad altre app. Inoltre, dichiara eventuali autorizzazioni di cui altre app devono disporre per accedere ai contenuti di questa app. Scopri di più sulle autorizzazioni nella sezione seguente.
  • Le funzionalità hardware e software richieste dall'app, che incidono sulle I dispositivi possono installare l'app da Google Play. Scopri di più sulla compatibilità dei dispositivi in una sezione successiva.

Se utilizzi Android Studio per creare la tua app, il file manifest viene creato automaticamente e la maggior parte degli elementi manifest essenziali vengono aggiunti durante la creazione dell'app, soprattutto quando usi i modelli di codice.

Funzionalità dei file

Le seguenti sezioni descrivono in che modo alcune delle caratteristiche più importanti della tua app sono indicate nel file manifest.

Componenti dell'app

Per ogni app componente che crei nella tua app, dichiarare un elemento XML corrispondente nel file manifest:

Se crei sottoclassi di questi componenti senza dichiararlo nel file manifest , il sistema non riesce ad avviarlo.

Specifica il nome della sottoclasse con name utilizzando la designazione completa del pacchetto. Ad esempio, un Activity sottoclasse è dichiarata come segue:

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

Tuttavia, se il primo carattere nel valore name è un punto, allo spazio dei nomi dell'app, dal file build.gradle a livello di modulo namespace è preceduta dal prefisso del nome. Ad esempio, se lo spazio dei nomi è "com.example.myapp", il seguente nome dell'attività viene risolto in com.example.myapp.MainActivity:

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

Per saperne di più sull'impostazione del nome del pacchetto o dello spazio dei nomi, consulta Impostare lo spazio dei nomi.

Se hai componenti dell'app che risiedono in sottopacchetti, ad esempio com.example.myapp.purchases, il valore name deve aggiungere il valore mancante ai nomi dei sottopacchetti, ad esempio ".purchases.PayActivity", oppure utilizza il nome completo del pacchetto.

Filtri per intent

Attività app, servizi e annunci i destinatari vengono attivati dagli intent. Un intent è un messaggio definito un oggetto Intent che descrive eseguire un'azione, inclusi i dati su cui agire, la categoria che dovrebbe eseguire l'azione e altre istruzioni.

Quando un'app invia un intent al sistema, quest'ultimo individua un'app. componente in grado di gestire l'intent in base al filtro per intent dichiarazioni nel file manifest di ogni app. Il sistema avvia un'istanza del componente corrispondente e passa l'oggetto Intent a questo componente. Se più app possono gestire l'intento, l'utente può selezionare l'app da utilizzare.

Un componente dell'app può avere un numero illimitato di filtri per intent (definiti con <intent-filter> ), ciascuna delle quali descrive una diversa capacità del componente.

Per ulteriori informazioni, consulta il documento Intent e filtri di intent.

Icone ed etichette

Alcuni elementi del file manifest hanno icon e label rispettivamente per la visualizzazione di una piccola icona e di un'etichetta di testo, agli utenti per il componente dell'app corrispondente.

In ogni caso, l'icona e l'etichetta impostate in un elemento principale diventano predefinite icon e label per tutti gli elementi secondari. Ad esempio, l'icona e l'etichetta impostate nel <application> sono l'icona e l'etichetta predefinite per ogni componente dell'app, ad esempio tutte le attività.

L'icona e l'etichetta impostate nella cartella <intent-filter> vengono mostrati all'utente ogni volta che il componente viene presentato come opzione per soddisfare un intento. Per impostazione predefinita, questa icona viene ereditata viene dichiarata per il componente principale, ovvero <activity> o Elemento <application>.

Potresti voler cambiare l'icona per un filtro per intent se fornisce un'azione univoca che vorresti indicare meglio nel finestra di dialogo del selettore. Per ulteriori informazioni, vedi Consentire ad altre app di avviare la tua attività.

Autorizzazioni

Le app per Android devono richiedere l'autorizzazione ad accedere a dati utente sensibili. come contatti e SMS o alcune funzionalità di sistema, come videocamera e accesso a internet. Ogni autorizzazione è identificata da un'etichetta univoca. Ad esempio, un'app che deve inviare SMS deve avere quanto segue: nel file manifest:

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

Inizia con Android 6.0 (livello API 23), l'utente può approvare o rifiutare alcune autorizzazioni app in fase di runtime. Ma indipendentemente dalla versione di Android supportata dalla tua app, devi dichiarare tutte le richieste di autorizzazione con un <uses-permission> nel file manifest. Se l'autorizzazione viene concessa, l'app può usare le funzionalità di machine learning. In caso contrario, i tentativi di accesso a queste funzionalità non andranno a buon fine.

La tua app può anche proteggere i propri componenti con autorizzazioni. Può usare qualsiasi autorizzazione definita da Android, elencata in android.Manifest.permission o un'autorizzazione dichiarato in un'altra app. L'app può anche definire le proprie autorizzazioni. Viene dichiarata una nuova autorizzazione con <permission> .

Per ulteriori informazioni, consulta la sezione Autorizzazioni su Android.

Compatibilità dei dispositivi

Nel file manifest puoi anche dichiarare quali tipi di hardware o le funzionalità software richieste dalla tua app e, per estensione, i tipi di dispositivi richiesti dall'app con cui è compatibile. Google Play Store non consente agli utenti di installare la tua app Su dispositivi che non forniscono le funzionalità o la versione di sistema della tua app richiede.

Esistono diversi tag manifest che definiscono i dispositivi a cui viene applicata la tua app compatibili. Di seguito sono riportate alcune delle più comuni.

<uses-feature>

Lo <uses-feature> ti consente di dichiarare hardware e le funzionalità software necessarie alla tua app. Ad esempio, se l'app non supporta le funzionalità di base funzionalità su un dispositivo senza sensore per la bussola, puoi dichiarare la bussola sensore come richiesto con il seguente tag manifest:

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

Nota: Se vuoi rendere disponibile la tua app sui Chromebook, esistono alcune importanti limitazioni di funzionalità hardware e software le informazioni da considerare. Per ulteriori informazioni, vedi Compatibilità del file manifest dell'app per Chromebook.

<uses-sdk>

Ogni versione successiva della piattaforma spesso aggiunge nuove API non disponibile nella versione precedente. Indicare la versione minima con cui è installata la tua app. compatibili, il file manifest deve includere il tag <uses-sdk> e le relative minSdkVersion .

Tuttavia, tieni presente che gli attributi nell'elemento <uses-sdk> vengono sostituite dalle proprietà corrispondenti nel file build.gradle. Pertanto, se utilizzi Android Studio, specifica minSdkVersion e targetSdkVersion valori disponibili:

Alla moda

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

Per saperne di più sul file build.gradle, leggi l'articolo su come configurare la build.

Per scoprire di più su come dichiarare il supporto della tua app per dispositivi diversi, consulta la sezione sulla compatibilità Panoramica.

Convenzioni relative ai file

Questa sezione descrive le convenzioni e le regole generalmente applicabili a tutti elementi e attributi nel file manifest.

Elements
Solo il <manifest> e <application> sono obbligatori. Devono verificarsi una sola volta. La maggior parte degli altri elementi può ripetersi zero o più volte. Tuttavia, alcune perché il file manifest sia utile.

Tutti i valori sono impostati tramite attributi, non come dati carattere all'interno un elemento.

Gli elementi allo stesso livello generalmente non sono ordinati. Ad esempio, <activity>, <provider> e <service> possono essere posizionati in qualsiasi ordine. Esistono due eccezioni principali: regola:

  • <activity-alias> deve seguire il <activity> per cui è un alias.
  • L'elemento <application> deve essere l'ultimo elemento all'interno di Elemento <manifest>.
Attributi
Tecnicamente, tutti gli attributi sono facoltativi. Tuttavia, molti attributi deve essere specificato in modo che un elemento possa svolgere il proprio scopo. Per gli attributi effettivamente facoltativi, la documentazione di riferimento indica i valori predefiniti.

Ad eccezione di alcuni attributi della radice <manifest> , tutti i nomi degli attributi iniziano con un prefisso android:, ad esempio android:alwaysRetainTaskState. Poiché il prefisso è universale, la documentazione in genere lo omette quando fa riferimento agli attributi per nome.

Più valori
Se è possibile specificare più di un valore, l'elemento è quasi sempre ripetuti, anziché più valori elencati all'interno di un singolo elemento. Ad esempio, un filtro per intent può elencare diverse azioni:
<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>
Valori delle risorse
Alcuni attributi hanno valori che vengono mostrati agli utenti, ad esempio: il titolo di un'attività o l'icona dell'app. Il valore di questi attributi variano in base alla lingua dell'utente o ad altre configurazioni del dispositivo (ad esempio, forniscono una diversa dimensione dell'icona in base alla densità dei pixel del dispositivo), quindi i valori devono essere impostati da una risorsa o un tema, invece di essere impostati come hardcoded nel manifest. Il valore effettivo può quindi variare in base a una alternativa risorse fornite per le diverse configurazioni dei dispositivi.

Le risorse sono espresse come valori con il seguente formato:

"@[package:]type/name"

Puoi omettere il nome package se la risorsa è fornita dal tuo (anche se è fornita da una dipendenza dalla libreria, perché le risorse della libreria sono unito alle tue). L'unico altro nome di pacchetto valido è android, quando vuoi utilizzare una risorsa dell'app Android il modello di machine learning.

type è un tipo di risorsa, ad esempio string o drawable, mentre name è il nome che identifica la risorsa specifica. Ecco un esempio:

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

Per saperne di più su come aggiungere risorse al tuo progetto, consulta Panoramica delle risorse per app.

Per applicare un valore definito in un tema, il primo carattere deve essere ? anziché @:

"?[package:]type/name"

Valori stringa
Quando un valore dell'attributo è una stringa, usa le doppie barre rovesciate. (\\) per caratteri di escape, ad esempio \\n per una nuova riga o \\uxxxx per un carattere Unicode.

Riferimento agli elementi manifest

La seguente tabella fornisce i link ai documenti di riferimento per tutte le elementi nel file AndroidManifest.xml.

<action> Aggiunge un'azione a un filtro per intent.
<activity> Dichiara un componente dell'attività.
<activity-alias> Dichiara un alias per un'attività.
<application> Dichiara l'applicazione.
<category> Aggiunge un nome di categoria a un filtro per intent.
<compatible-screens> Specifica ogni configurazione di schermata con cui l'applicazione è compatibile.
<data> Aggiunge una specifica dei dati a un filtro per intent.
<grant-uri-permission> Specifica i sottoinsiemi di dati dell'app a cui il fornitore di contenuti principale è autorizzato ad accedere.
<instrumentation> Dichiara una classe Instrumentation che consente di monitorare l'interazione di un'applicazione con il sistema.
<intent-filter> Specifica i tipi di intent a cui un'attività, un servizio o un broadcast receiver può rispondere.
<manifest> L'elemento principale del file AndroidManifest.xml.
<meta-data> Una coppia nome-valore per un elemento di dati arbitrari aggiuntivi che può essere fornito al componente principale.
<path-permission> Definisce il percorso e le autorizzazioni richieste per un sottoinsieme specifico di dati all'interno di un fornitore di contenuti.
<permission> Dichiara un'autorizzazione di sicurezza che può essere utilizzata per limitare l'accesso a funzionalità o componenti specifici di questa o altre applicazioni.
<permission-group> Dichiara un nome per un raggruppamento logico di autorizzazioni correlate.
<permission-tree> Dichiara il nome di base per una struttura di autorizzazioni.
<provider> Dichiara un componente del fornitore di contenuti.
<queries> Dichiara l'insieme di altre app a cui la tua app intende accedere. Scopri di più Nella guida sulla visibilità del pacchetto dei risultati.
<receiver> Dichiara un componente di broadcast receiver.
<service> Dichiara un componente del servizio.
<supports-gl-texture> Dichiara un singolo formato di compressione delle texture GL supportato dall'app.
<supports-screens> Dichiara le dimensioni dello schermo supportate dalla tua app e attiva la modalità di compatibilità dello schermo per schermi di dimensioni superiori a quelle supportate dall'app.
<uses-configuration> Indica le funzionalità di input specifiche richieste dall'applicazione.
<uses-feature> Dichiara una singola funzionalità hardware o software utilizzata dall'applicazione.
<uses-library> Specifica una libreria condivisa a cui deve essere collegata l'applicazione.
<uses-native-library> Specifica una libreria condivisa nativa fornita dal fornitore a cui deve essere collegata l'app.
<uses-permission> Specifica un'autorizzazione di sistema che l'utente deve concedere per consentire il corretto funzionamento dell'app.
<uses-permission-sdk-23> Specifica che un'app richiede una determinata autorizzazione, ma solo se è installata su un dispositivo con Android 6.0 (livello API 23) o versioni successive.
<uses-sdk> Consente di esprimere la compatibilità di un'applicazione con una o più versioni della piattaforma Android mediante un numero intero a livello API.

Limiti

I seguenti tag presentano un limite al numero di occorrenze in un file manifest:

Nome del tag Limite
<package> 1000
<meta-data> 1000
<uses-library> 1000

La lunghezza massima è limitata per i seguenti attributi:

Attributo Limite
name 1024
versionName 1024
host 255
mimeType 255

File manifest di esempio

Il seguente codice XML è un semplice esempio AndroidManifest.xml che dichiara due attività per l'app.

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