Omówienie pliku manifestu aplikacji

Każdy projekt aplikacji musi mieć plik AndroidManifest.xml, który dokładnie imię i nazwisko, w katalogu głównym zbioru źródłowego projektu. Plik manifestu zawiera najważniejsze informacje o aplikacji, które są potrzebne narzędziom do kompilacji Androida, systemowi operacyjnemu Android i Google Play.

Plik manifestu musi zawierać między innymi te elementy:

  • Komponenty aplikacji, w tym wszystkie czynności, usługi, odbiorniki transmisji i dostawcy treści. Każdy komponent musi definiować podstawowe właściwości, takie jak nazwa klasy Kotlin lub Java. Może też deklarować możliwości, np. które konfiguracje urządzeń może obsługiwać, oraz filtry intencji, które opisują, jak można uruchomić komponent. Więcej informacji o komponentach aplikacji znajdziesz w kolejnej sekcji.
  • Uprawnienia wymagane przez aplikację dostęp do chronionych części systemu lub innych aplikacji. Zawiera ona również deklarację wszelkich uprawnień, które inne aplikacje muszą mieć, aby uzyskać dostęp do treści z tej aplikacji. Więcej informacji o uprawnieniach znajdziesz w następnej sekcji.
  • funkcje sprzętowe i programowe, których wymaga aplikacja, co wpływa na to, na jakich urządzeniach można ją zainstalować z Google Play; Więcej informacji o zgodności urządzeń znajdziesz w kolejnej sekcji.

Jeśli tworzysz aplikację za pomocą Android Studio, plik manifestu jest tworzone automatycznie, a większość podstawowych elementów manifestu jest dodawana jako zwłaszcza wtedy, gdy używasz szablonów kodu.

Funkcje pliku

W następnych sekcjach opisano, jak niektóre z najważniejszych właściwości aplikacji są odzwierciedlane w pliku manifestu.

Komponenty aplikacji

W pliku manifestu zadeklaruj odpowiedni element XML dla każdego elementu aplikacji, który utworzysz w aplikacji:

Jeśli zmienisz klasę dowolnego z tych komponentów na podklasę bez zadeklarowania go w pliku manifestu system nie może go uruchomić.

Podaj nazwę podklasy za pomocą atrybutu name używając pełnego oznaczenia pakietu. Na przykład Podklasa Activity jest deklarowana w ten sposób:

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

Jeśli jednak pierwszy znak w wartości name to kropka, przed nazwą namespace zostanie dodany prefiks z przestrzeni nazw aplikacji z pliku build.gradle na poziomie modułu. Jeśli na przykład przestrzeń nazw to "com.example.myapp", ta nazwa aktywności odpowiada com.example.myapp.MainActivity:

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

Więcej informacji o ustawianiu nazwy lub przestrzeni nazw pakietu znajdziesz w artykule Ustawianie przestrzeni nazw.

Jeśli masz komponenty aplikacji, które znajdują się w podpakietach, np. com.example.myapp.purchases, wartość name musi zawierać brakujące nazwy podpakietów, np. ".purchases.PayActivity", lub musisz użyć pełnej nazwy pakietu.

Filtry intencji

Aktywność w aplikacjach, usługi i komunikaty odbiorcy są aktywowani przez zamiary. Intencja to wiadomość zdefiniowana przez obiekt Intent, która opisuje działanie do wykonania, w tym dane, na których ma ono polegać, kategorię komponentu, który ma je wykonać, oraz inne instrukcje.

Gdy aplikacja wysyła intencję do systemu, system znajduje komponent aplikacji, który może obsłużyć intencję na podstawie deklaracji filtru intencji w pliku manifestu każdej aplikacji. System uruchamia instancję pasującego komponentu i przekazuje mu obiekt Intent. Jeśli więcej niż jedna aplikacja może obsługuje intencję, użytkownik może wybrać aplikację, której chce użyć.

Komponent aplikacji może mieć dowolną liczbę filtrów intencji (zdefiniowanych za pomocą elementu <intent-filter>), z których każdy opisuje inną funkcję tego komponentu.

Więcej informacji znajdziesz w dokumentacji Intencje i filtry intencji.

Ikony i etykiety

Niektóre elementy pliku manifestu mają atrybuty iconlabel, które służą do wyświetlania użytkownikom odpowiedniego elementu aplikacji odpowiednio w postaci małej ikony lub etykiety tekstowej.

W każdym przypadku ikona i etykieta ustawione w elemencie nadrzędnym stają się domyślną wartością iconlabel dla wszystkich elementów podrzędnych. Na przykład ikona i etykieta ustawione w elemencie <application> są domyślną ikoną i etykietą każdego komponentu aplikacji, np. wszystkich działań.

Ikona i etykieta ustawione w komponencie <intent-filter> są wyświetlane, gdy komponent jest przedstawiony jako opcja realizowanych celów. Domyślnie ta ikona jest dziedziczona z ikony zadeklarowanej dla komponentu nadrzędnego, czyli z elementu <activity> lub <application>.

Możesz zmienić ikonę filtra intencji, jeśli zawiera ono unikalne działanie, które chcesz lepiej przedstawić w oknie wyboru. Więcej informacji znajdziesz w artykule Zezwalanie innym aplikacjom na uruchamianie aktywności.

Uprawnienia

Aplikacje na Androida muszą prosić o dostęp do danych wrażliwych użytkownika, takich jak kontakty i SMS-y, lub do niektórych funkcji systemu, takich jak aparat i dostęp do internetu. Każde uprawnienie jest oznaczone unikalną etykietą. Na przykład aplikacja, która musi wysyłać SMS-y, musi zawierać w pliku manifestu tę linię:

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

Począwszy od Androida 6.0 (poziom interfejsu API 23) użytkownik może zatwierdzać lub odrzucać niektóre uprawnienia aplikacji w czasie działania. Niezależnie od tego, którą wersję Androida obsługuje Twoja aplikacja, musisz zadeklarować wszystkie prośby o przyznanie uprawnień za pomocą elementu <uses-permission> w manifeście. Jeśli to uprawnienie zostanie przyznane, aplikacja będzie mogła korzystać z chronionego funkcje zabezpieczeń. W przeciwnym razie próby uzyskania dostępu do tych funkcji się nie uda.

Aplikacja może też chronić swoje komponenty za pomocą uprawnień. Może ona używać dowolnych uprawnień zdefiniowanych przez Androida (wymienionych w sekcji android.Manifest.permission) lub uprawnień zadeklarowanych w innej aplikacji. Aplikacja może też definiować własne uprawnienia. Nowe uprawnienie zostało zadeklarowane razem z <permission> .

Więcej informacji znajdziesz w artykule Uprawnienia na Androidzie.

Zgodność urządzeń

Plik manifestu to także miejsce, w którym możesz zadeklarować, jakiego typu sprzęt lub funkcji oprogramowania wymaganych przez aplikację, a także typów urządzeń, na których aplikacja który jest zgodny z technologią. Sklep Google Play nie zezwala użytkownikom na instalowanie Twojej aplikacji na urządzeniach, które nie mają funkcji lub wersji systemu dostępnych dla aplikacji wymaga.

Istnieje kilka tagów pliku manifestu, które określają, z jakimi urządzeniami jest zgodna aplikacja. Oto najpopularniejsze z nich.

<uses-feature>

Element <uses-feature> umożliwia zadeklarowanie funkcji sprzętu i oprogramowania, których potrzebuje aplikacja. Jeśli na przykład aplikacja nie może osiągnąć podstawowych W przypadku urządzenia bez czujnika kompasu możesz zadeklarować, czujnika zgodnie z wymaganiami z następującym tagiem manifestu:

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

Uwaga: jeśli chcesz udostępnić aplikację na Chromebookach, musisz wziąć pod uwagę ważne ograniczenia funkcji sprzętowych i programowych. Więcej informacji: Zgodność pliku manifestu aplikacji Chromebooki.

<uses-sdk>

Każda kolejna wersja platformy często dodaje nowe interfejsy API, dostępne w poprzedniej wersji. Aby wskazać minimalną wersję, z którą jest zgodna Twoja aplikacja, manifest musi zawierać tag <uses-sdk> i jego atrybut minSdkVersion.

Pamiętaj jednak, że atrybuty w elemencie <uses-sdk> są zastępowane przez odpowiadające im właściwości w pliku build.gradle. Jeśli używasz Android Studio, zamiast tego podaj tam wartości minSdkVersiontargetSdkVersion:

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

Więcej informacji o pliku build.gradle znajdziesz w artykule o konfigurowaniu kompilacji.

Więcej informacji o deklarowaniu obsługi różnych urządzeń przez aplikację znajdziesz w artykule Omówienie zgodności z urządzeniami.

Konwencje plików

W tej sekcji opisano konwencje i zasady, które ogólnie dotyczą wszystkich elementów i atrybutów w pliku manifestu.

Elementy
Tylko <manifest> i <application> elementów są wymagane. Każda z nich musi wystąpić tylko raz. Większość pozostałych elementów może wystąpić zero lub więcej razy. Jednak aby plik manifestu był użyteczny, musi zawierać niektóre z nich.

Wszystkie wartości są ustawiane przez atrybuty, a nie jako dane znaków w obrębie i inne elementy.

Elementy na tym samym poziomie nie są zwykle uporządkowane. Na przykład elementy <activity>, <provider><service> można umieścić w dowolnej kolejności. Istnieją 2 główne wyjątki od tej reguły reguła:

  • Element <activity-alias> musi znajdować się po elemencie <activity>, którego jest aliasem.
  • Element <application> musi być ostatnim elementem wewnątrz <manifest>.
Atrybuty
Formalnie wszystkie atrybuty są opcjonalne. Jednak w przypadku wielu atrybutów musi być określony, aby element mógł zrealizować swoje przeznaczenie. W przypadku atrybutów naprawdę opcjonalnych zapoznaj się z dokumentacją wskazuje wartości domyślne.

Z wyjątkiem niektórych atrybutów elementu <manifest> wszystkie nazwy atrybutów zaczynają się od prefiksu android:, na przykład android:alwaysRetainTaskState. Ponieważ prefiks jest uniwersalny, w dokumentacji zazwyczaj pomija się go, gdy odnosi się do atrybutów po nazwie.

Wiele wartości
Jeśli można podać więcej niż jedną wartość, element jest prawie zawsze powtarzany, a nie podaje się kilku wartości w ramach jednego elementu. Na przykład filtr intencji może wyświetlić listę kilku działań:
<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>
Wartości zasobów
Niektóre atrybuty mają wartości wyświetlane użytkownikom, np. tytuł aktywności lub ikonę aplikacji. Wartości tych atrybutów mogą różnią się w zależności od języka użytkownika lub innych konfiguracji urządzenia (np. ikona ikony powinna mieć inny rozmiar w zależności od gęstości pikseli na ekranie). wartości powinny być ustawiane na podstawie zasobu lub motywu, a nie na stałe manifestu. Rzeczywista wartość może się następnie zmienić w zależności od parametru alternatywnego zasobów dostępnych na potrzeby różnych konfiguracji urządzeń.

Zasoby są wyrażane jako wartości w tym formacie:

"@[package:]type/name"

Możesz pominąć nazwę package, jeśli zasób jest dostarczany przez Twoją aplikację (w tym przez bibliotekę zależną, ponieważ zasoby biblioteki są scalane z Twoimi). Jedyna inna prawidłowa nazwa pakietu to android, gdy chcesz skorzystać z zasobu z Androida platformy.

type jest typem zasobu, np. string lub drawable, a name to nazwa identyfikująca konkretny zasób. Oto przykład:

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

Więcej informacji o dodawaniu zasobów do projektu znajdziesz w artykule Omówienie zasobów aplikacji.

Aby zastosować wartość zdefiniowaną w motywie, pierwszym znakiem musi być ?, a nie @:

"?[package:]type/name"

Wartości ciągu znaków
Gdy wartość atrybutu jest ciągiem znaków, użyj podwójnych ukośników lewych (\\), aby zmienić znaczenie znaków, np. \\n dla nowego wiersza lub \\uxxxx w przypadku znaku Unicode.

Odniesienie do elementów pliku manifestu

W tabeli poniżej znajdziesz linki do dokumentów referencyjnych dotyczących wszystkich prawidłowych elementów w pliku AndroidManifest.xml.

<action> Dodaje działanie do filtra intencji.
<activity> Deklaruje komponent aktywności.
<activity-alias> Deklaruje alias aktywności.
<application> Deklaruje aplikację.
<category> Dodaje nazwę kategorii do filtra intencji.
<compatible-screens> Określa każdą konfigurację ekranu, z którą aplikacja jest zgodna.
<data> Dodaje specyfikację danych do filtra intencji.
<grant-uri-permission> Określa podzbiory danych aplikacji, do których ma dostęp nadrzędny dostawca treści.
<instrumentation> Deklaruje klasę Instrumentation, która umożliwia monitorowanie interakcji aplikacji z systemem.
<intent-filter> Określa typy intencji, na które może reagować działanie, usługa lub odbiornik.
<manifest> Element główny pliku AndroidManifest.xml.
<meta-data> Para nazwa-wartość dla elementu dodatkowych, dowolnych danych, które można podać do komponentu nadrzędnego.
<path-permission> Definiuje ścieżkę i wymagane uprawnienia do określonego podzbioru danych w ramach dostawcy treści.
<permission> Deklaruje uprawnienie bezpieczeństwa, które może służyć do ograniczania dostępu do określonych składników lub funkcji tej lub innych aplikacji.
<permission-group> Określa nazwę logicznego grupowania powiązanych ze sobą uprawnień.
<permission-tree> Deklaruje nazwę podstawową dla drzewa uprawnień.
<provider> Deklaruje komponent dostawcy treści.
<queries> Określa zestaw innych aplikacji, do których Twoja aplikacja ma uzyskiwać dostęp. Więcej informacji znajdziesz w przewodniku na temat filtrowania widoczności pakietu.
<receiver> Deklaruje komponent odbiornika transmisji.
<service> Deklaruje komponent usługi.
<supports-gl-texture> Deklaruje format kompresji tekstur pojedynczego GL, który jest obsługiwany przez aplikację.
<supports-screens> Deklaruje rozmiary ekranów, które obsługuje Twoja aplikacja, i włącza tryb zgodności ekranu w przypadku ekranów większych niż obsługiwane przez Twoją aplikację.
<uses-configuration> Wskazuje funkcje wejściowe wymagane przez aplikację.
<uses-feature> Zadeklaruj pojedynczą funkcję sprzętową lub programową, z której korzysta aplikacja.
<uses-library> Określa bibliotekę współdzieloną, z którą musi być połączona aplikacja.
<uses-native-library> Określa natywną bibliotekę udostępnioną przez dostawcę, z którą aplikacja musi być powiązana.
<uses-permission> Określa uprawnienie systemowe, które użytkownik musi przyznać, aby aplikacja działała prawidłowo.
<uses-permission-sdk-23> Określa, że aplikacja chce uzyskać określone uprawnienie, ale tylko wtedy, gdy jest zainstalowana na urządzeniu z Androidem 6.0 (poziom interfejsu API 23) lub nowszym.
<uses-sdk> Umożliwia określenie zgodności aplikacji z jedną lub wieloma wersjami platformy Android za pomocą liczby całkowitej poziomu interfejsu API.

Limity

W pliku manifestu obowiązuje limit liczby wystąpień tych tagów:

Nazwa tagu Limit
<package> 1000
<meta-data> 1000
<uses-library> 1000

Maksymalna długość tych atrybutów jest ograniczona:

Atrybut Limit
name 1024
versionName 1024
host 255
mimeType 255

Przykładowy plik manifestu

Poniższy kod XML to prosty przykład atrybutu AndroidManifest.xml, który deklaruje dwie aktywności w aplikacji.

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