AndroidManifest.xml je povinný konfigurační soubor každé Android aplikace, který popisuje její komponenty, oprávnění a metadata. Systém Android tento soubor čte při instalaci a spouštění každé aplikace. Podle Android Developers, 2025 se bez správného manifestu aplikace neinstaluje do zařízení. AndroidManifest.xml registruje Activity, Service, BroadcastReceiver a ContentProvider pro operační systém.
Hlavní body
AndroidManifest.xml je hlavní konfigurační soubor ve formátu XML, který musí každý Android projekt obsahovat v adresáři app/src/main. Systém Android jej analyzuje před spuštěním jakéhokoli kódu aplikace — ve fázi parsování APK při instalaci. Pokud je v manifestu syntaktická chyba nebo chybí povinná deklarace, instalace je přerušena chybovou zprávou.
Soubor obsahuje úplnou deklaraci aplikace: seznam všech komponent (Activity, Service, BroadcastReceiver, ContentProvider), požadovaná oprávnění, minimální verzi SDK, hardwarové požadavky a konfiguraci motivů a stylů. Každá komponenta, která může být volána systémem nebo jinými aplikacemi, musí být explicitně deklarována v manifestu. Toto je bezpečnostní požadavek: bez explicitní deklarace není komponenta k dispozici pro volání.
Bez správně nakonfigurovaného manifestu nelze aplikaci nainstalovat prostřednictvím Google Play nebo sideloadingu. Systém kontroluje manifest ve fázi parsování APK a při chybách instalaci odmítá. Google Play také skenuje manifest kvůli nebezpečným konfiguracím: pro exported=true na komponentě bez intent-filter se zobrazí varování, a při chybějících povinných oprávněních pro targetSdk 34+ je publikování blokováno. Proto je porozumění struktuře manifestu povinnou dovedností vývojáře Androidu.
Každá komponenta Android aplikace musí být explicitně zaregistrována v manifestu. Toto je povinný požadavek platformy pro všechny čtyři typy komponent. Bez registrace nemůže být komponenta vytvořena systémem a pokus o její spuštění povede k výjimce ActivityNotFoundException nebo podobné. Komponenty se registrují uvnitř tagu application v pořadí, které neovlivňuje jejich činnost.
Tag activity registruje obrazovku aplikace. Atribut exported určuje, zda mohou jiné aplikace spouštět tuto Activity. Od Androidu 12 způsobuje absence exported při přítomnosti intent-filter chybu kompilace — to je bezpečnostní požadavek. Vstupní bod se nastavuje pomocí intent-filter s action MAIN a category LAUNCHER. Každá Activity musí mít jedinečný android:name odpovídající úplnému nebo relativnímu názvu třídy.
<activity
android:name=".MainActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Tag service definuje službu na pozadí. Od Androidu 8 mají služby na pozadí přísná omezení: foreground service vyžaduje povinné oznámení s ikonou viditelnou uživateli, a bound service žije pouze při existenci připojeného klienta. Služby běžící na pozadí bez oznámení jsou automaticky ukončeny systémem několik minut po přechodu aplikace do režimu na pozadí. Pro dlouhodobé úlohy používejte WorkManager místo Service.
<service
android:name=".SyncService"
android:exported="false"
android:foregroundServiceType="dataSync" />
Tag receiver deklaruje přijímač systémových nebo vlastních vysílacích zpráv. Od Androidu 8 většina implicitních vysílání již není doručována staticky deklarovaným přijímačům v manifestu. Místo toho se doporučuje dynamická registrace přijímačů pomocí Context.registerReceiver v kódu. Výjimkou jsou některá systémová vysílání, například BOOT_COMPLETED, která stále vyžadují statickou registraci v manifestu.
<receiver
android:name=".ConnectivityReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Každé nebezpečné oprávnění v Androidu vyžaduje deklaraci v manifestu pomocí tagu uses-permission. Od Androidu 6 jsou nebezpečná oprávnění vyžadována za běhu prostřednictvím dialogu s uživatelem, ale deklarace v manifestu zůstává povinná. Bez ní metoda requestPermissions vyvolá výjimku SecurityException. Oprávnění normální úrovně, jako INTERNET a ACCESS_NETWORK_STATE, jsou udělena automaticky při instalaci.
| Oprávnění | Účel |
|---|---|
| CAMERA | Přístup ke kameře zařízení pro focení a video |
| ACCESS_FINE_LOCATION | Přesná geolokace pomocí GPS a sítě |
| RECORD_AUDIO | Nahrávání zvuku z mikrofonu zařízení |
| READ_CONTACTS | Čtení kontaktů z telefonního seznamu |
| POST_NOTIFICATIONS | Odesílání oznámení na Android 13+ |
Tag uses-permission-sdk-23 určuje oprávnění potřebná pouze na Android 6.0+. To umožňuje zachovat kompatibilitu se staršími verzemi bez žádosti o neexistující oprávnění. Například POST_NOTIFICATIONS je dostupné pouze na Android 13+, proto musí být uvedeno pomocí uses-permission-sdk-33, aby na starších zařízeních nedošlo k chybě neznámého oprávnění. Atribut maxSdkVersion v uses-permission umožňuje automatické odvolání nepotřebných oprávnění při aktualizaci aplikace na novější verze Androidu.
Oprávnění normální úrovně (INTERNET, ACCESS_NETWORK_STATE) jsou udělována automaticky při instalaci a nevyžadují žádost za běhu. Jsou také deklarována pomocí uses-permission, ale nejsou uživateli zobrazena v dialogu. Pro řízení přístupu ke komponentám aplikace z jiných aplikací se používá mechanismus permission-protected components: lze nastavit vlastní oprávnění na úrovni Activity nebo Service, které bude systém kontrolovat při volání komponenty zvenčí. To poskytuje další úroveň zabezpečení pro meziprocesovou komunikaci.
Tag intent-filter v manifestu deklaruje, jaké implicitní intenty může komponenta zpracovávat. Toto je mechanismus, kterým Android propojuje systémové nebo vlastní akce s aplikací. Intent filter se skládá ze tří prvků: action (akce), category (kategorie) a data (data). Všechny tři lze kombinovat pro přesný popis toho, jaké intenty má komponenta přijímat. Systém vybírá vhodnou komponentu na základě nejkonkrétnějšího filtru.
<activity android:name=".DeepLinkActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="itsectr.com"
android:pathPrefix="/app" />
</intent-filter>
</activity>
Atribut autoVerify zapíná ověření Android App Links: systém kontaktuje server pro potvrzení vlastnictví domény. Bez ověření fungují hluboké odkazy prostřednictvím standardního dialogu výběru, kde uživatel volí, kterou aplikací odkaz otevřít. Po úspěšném ověření se odkazy otevírají přímo v aplikaci bez dialogu. Google Search Console také používá autoVerify pro indexování deep linků a jejich zobrazování ve výsledcích vyhledávání.
Filtry s action.VIEW a kategoriemi DEFAULT a BROWSABLE zpracovávají odkazy z prohlížeče, e-mailu a dalších aplikací. Toto je hlavní mechanismus implementace hlubokých odkazů v Androidu. Pro podporu vlastních URL schémat, například myapp://, stačí uvést scheme bez hostitele. Google však doporučuje používat HTTPS hluboké odkazy místo vlastních schémat, protože jsou bezpečnější a nevyžadují další oprávnění. Vlastní schémata mohou být zachycena jakoukoli aplikací, která zaregistrovala stejné schéma.
Kořenový tag manifest obsahuje atributy balíčku, verze a SDK. Tag application ukládá globální nastavení: motiv, ikonu, popisek a ladící příznaky. Atributy manifestu nastavují verzování na úrovni balíčku, zatímco atributy application definují vzhled a chování aplikace jako celku. Hodnoty mohou být odkazy na zdroje pomocí @-syntaxe nebo řetězcové literály.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itsectr.myapp"
<uses-sdk
android:minSdkVersion="24"
android:targetSdkVersion="34" />
<application
android:label="MyApp"
android:icon="@mipmap/ic_launcher"
android:theme="@style/Theme.MyApp"
android:supportsRtl="true"
android:allowBackup="true">
<!-- Komponenty aplikace -->
</application>
</manifest>
Tag meta-data uvnitř application umožňuje ukládání libovolných párů klíč-hodnota. To je vhodné pro konfiguraci knihoven třetích stran: API klíče, adresy endpointů a příznaky funkcionality. Data z meta-data jsou dostupná prostřednictvím PackageManager.getApplicationInfo().metaData za běhu. Například Firebase a Google Maps používají meta-data k předávání přístupových klíčů bez pevného kódování ve zdrojovém kódu. Klíče se uvádějí v manifestu a mohou se lišit pro různé varianty sestavení.
Atribut android:extractNativeLibs řídí extrakci nativních knihoven z APK. Pro aplikace s targetSdk 34+ musí být tento atribut explicitně uveden, jinak může sestavení selhat s chybou INSTALL_FAILED_INVALID_APK. Pokud je extractNativeLibs=false, nativní knihovny zůstávají uvnitř APK bez rozbalení, což snižuje velikost nainstalované aplikace, ale zvyšuje dobu načítání knihoven. Pro většinu moderních aplikací se doporučuje extractNativeLibs=false pro úsporu místa na disku uživatele.
Atribut android:networkSecurityConfig umožňuje zadat konfigurační soubor zabezpečení sítě. To je důležité zejména pro aplikace s targetSdk 28+, kde je HTTP provoz ve výchozím nastavení blokován. Konfigurační soubor určuje důvěryhodné certifikáty, domény pro HTTP připojení a pravidla pro přiřazování certifikátů. Nahrazuje zastaralý atribut android:usesCleartextTraffic a poskytuje flexibilnější mechanismus správy zabezpečení připojení na úrovni operačního systému.
Atribut android:largeHeap požaduje zvětšenou velikost haldy pro aplikaci. Výchozí nastavení Androidu přiděluje každé aplikaci omezené množství paměti v závislosti na zařízení a verzi operačního systému. Pokud aplikace pracuje s těžkými obrázky, videem nebo velkými datovými sadami, largeHeap může zabránit OutOfMemoryError. Zneužívání tohoto atributu je však škodlivé: aplikace s vysokou spotřebou paměti je při nedostatku zdrojů systémem rychleji ukončena. Používejte largeHeap pouze po profilování a potvrzení nezbytnosti.
Často kladené otázky
Od Androidu 12 způsobuje absence atributu exported při přítomnosti intent-filter chybu kompilace. Systém vyžaduje explicitní uvedení viditelnosti každé komponenty s intent-filter — to je bezpečnostní opatření k zabránění náhodnému otevření komponent jinými aplikacemi. Pro Activity bez intent-filter je exported ve výchozím nastavení false.
Ano, ale v launcheru se zobrazí několik ikon aplikace. Každá Activity s MAIN/LAUNCHER se stává samostatným vstupním bodem. Používá se to k vytváření zástupců do různých částí aplikace, například pro přímý přechod do nastavení nebo vytvoření nového záznamu. Každá ikona otevírá přímo odpovídající Activity.
Android slučuje manifesty z knihoven s hlavním manifestem aplikace. Při konfliktu atributů se používá tools:replace nebo tools:node="merge" k vyřešení. Tento mechanismus je automatický: při přidání knihovny přes Gradle se její manifest sloučí s hlavním. Pro zrušení nebo nahrazení atributu z knihovny použijte tools:node="remove" nebo tools:replace="attributeName".
Typické příčiny: oprávnění není deklarováno v manifestu pomocí uses-permission, používá se oprávnění normální úrovně (bez žádosti za běhu), uživatel zvolil "Znovu se neptat" a oprávnění je natrvalo odepřeno, nebo targetSdkVersion je nižší než 23, kde se oprávnění vyžadují při instalaci. Pro diagnostiku zkontrolujte manifest a protokoly pomocí adb logcat.
Atribut android:debuggable zapíná ladění aplikace přes ADB. Pro vydání v Google Play musí být false. Pokud je debuggable=true ve vydání, může se útočník připojit k aplikaci přes ADB, číst data a spouštět libovolný kód. Google Play automaticky blokuje publikování sestavení s debuggable=true.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také