AndroidManifest.xml је обавезни конфигурациони фајл сваке Android апликације, који описује њене компоненте, дозволе и метаподатке. Систем Android чита овај фајл приликом инсталације и покретања сваке апликације. Према Android Developers, 2025, без исправног манифеста апликација се не инсталира на уређају. AndroidManifest.xml региструје Activity, Service, BroadcastReceiver и ContentProvider за оперативни систем.
Главно
AndroidManifest.xml je основни конфигурациони фајл у формату XML који сваки Android пројекат мора да садржи у директоријуму app/src/main. Систем Android га анализира пре покретања било ког кода апликације — у фази парсирања APK-а приликом инсталације. Ако у манифесту постоји синтаксна грешка или недостаје обавезна декларација, инсталација се прекида са поруком о грешци.
Фајл садржи потпуну декларацију апликације: листу свих компоненти (Activity, Service, BroadcastReceiver, ContentProvider), тражене дозволе, минималну верзију SDK-а, хардверске захтеве и конфигурацију тема и стилова. Свака компонента која може бити позвана од стране система или других апликација мора бити експлицитно декларисана у манифесту. Ово је безбедносни захтев: без експлицитне декларације компонента није доступна за позивање.
Без правилно конфигурисаног манифеста апликација не може бити инсталирана преко Google Play или sideloading-а. Систем проверава манифест у фази парсирања APK-а и одбија инсталацију при грешкама. Google Play такође скенира манифест у потрази за небезбедним конфигурацијама: за exported=true на компоненти без intent-filter издаје се упозорење, а у случају недостатка обавезних дозвола за targetSdk 34+ објављивање се блокира. Због тога је разумевање структуре манифеста обавезна вештина Android програмера.
Свака компонента Android апликације мора бити експлицитно регистрована у манифесту. Ово је обавезан захтев платформе за сва четири типа компоненти. Без регистрације компонента не може бити креирана од стране система, а покушај њеног покретања ће довести до изузетка ActivityNotFoundException или сличног. Компоненте се региструју унутар тага application редоследом који не утиче на њихов рад.
Таг activity региструје екран апликације. Атрибут exported одређује да ли друге апликације могу да покрену ову Activity. Од Android 12, недостатак exported-а у присуству intent-filter-а изазива грешку компајлирања — ово је безбедносни захтев. Улазна тачка се поставља кроз intent-filter са action MAIN и category LAUNCHER. Свака Activity мора имати јединствено android:name које одговара пуном или релативном имену класе.
<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>
Таг service дефинише позадински сервис. Од Android 8, позадински сервиси имају строга ограничења: foreground service захтева обавезно обавештење са иконом видљиво кориснику, а bound service живи само док постоји повезани клијент. Сервиси који раде у позадини без обавештења се аутоматски завршавају од стране система неколико минута након преласка апликације у позадински режим. За дуготрајне задатке користите WorkManager уместо Service.
<service
android:name=".SyncService"
android:exported="false"
android:foregroundServiceType="dataSync" />
Таг receiver декларише пријемник системских или прилагођених емитованих порука. Од Android 8, већина имплицитних емитовања се више не достављају статички декларисаним пријемницима у манифесту. Уместо тога, препоручује се динамичка регистрација пријемника кроз Context.registerReceiver у коду. Изузетак су нека системска емитовања, попут BOOT_COMPLETED, која и даље захтевају статичку регистрацију у манифесту.
<receiver
android:name=".ConnectivityReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Свака опасна дозвола у Android-у захтева декларацију у манифесту кроз таг uses-permission. Од Android 6, опасне дозволе се траже у време извршавања кроз дијалог са корисником, али декларација у манифесту остаје обавезна. Без ње метода requestPermissions баца изузетак SecurityException. Дозволе нормалног нивоа, попут INTERNET и ACCESS_NETWORK_STATE, се додељују аутоматски приликом инсталације.
| Дозвола | Намена |
|---|---|
| CAMERA | Приступ камери уређаја за фото и видео |
| ACCESS_FINE_LOCATION | Прецизна геолокација путем GPS-а и мреже |
| RECORD_AUDIO | Снимање звука са микрофона уређаја |
| READ_CONTACTS | Читање контаката из телефонског именика |
| POST_NOTIFICATIONS | Слање обавештења на Android 13+ |
Таг uses-permission-sdk-23 наводи дозволе потребне само на Android 6.0+. Ово омогућава одржавање компатибилности са старијим верзијама без захтевања дозвола које не постоје. На пример, POST_NOTIFICATIONS је доступно само на Android 13+, па га треба навести кроз uses-permission-sdk-33 како на старијим уређајима не би дошло до грешке непознате дозволе. Атрибут maxSdkVersion у uses-permission омогућава аутоматско опозивање непотребних дозвола приликом ажурирања апликације на новијим верзијама Android-а.
Дозволе нормалног нивоа (INTERNET, ACCESS_NETWORK_STATE) се додељују аутоматски приликом инсталације и не захтевају захтев у време извршавања. Оне се такође декларишу кроз uses-permission, али се не приказују кориснику у дијалогу. За контролу приступа компонентама апликације из других апликација користи се механизам permission-protected components: може се навести прилагођена дозвола на нивоу Activity или Service коју ће систем проверити приликом позивања компоненте споља. Ово обезбеђује додатни ниво сигурности за међупроцесну комуникацију.
Таг intent-filter у манифесту декларише које имплицитне интенте може да обрађује компонента. Ово је механизам кроз који Android повезује системске или прилагођене акције са апликацијом. Intent filter се састоји од три елемента: action (акција), category (категорија) и data (подаци). Сва три могу бити комбинована за прецизно описивање које интенте треба да прима компонента. Систем бира одговарајућу компоненту на основу најспецифичнијег филтера.
<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>
Атрибут autoVerify укључује проверу Android App Links: систем контактира сервер ради потврде власништва над доменом. Без верификације дубински линкови раде кроз стандардни дијалог избора, где корисник бира којом апликацијом да отвори линк. Након успешне верификације, линкови се отварају директно у апликацији без дијалога. Google Search Console такође користи autoVerify за индексирање deep link-ова и приказ у резултатима претраге.
Филтери са action.VIEW и категоријама DEFAULT и BROWSABLE обрађују линкове из прегледача, е-поште и других апликација. Ово је основни механизам имплементације дубинских линкова у Android-у. За подршку прилагођеним URL шемама, на пример myapp://, довољно је навести scheme без host-а. Међутим, Google препоручује коришћење HTTPS дубинских линкова уместо прилагођених шема, јер су сигурнији и не захтевају додатне дозволе. Прилагођене шеме могу бити пресретнуте од стране било које апликације која је регистровала исту шему.
Коренски таг manifest садржи атрибуте пакета, верзије и SDK-а. Таг application чува глобална подешавања: тему, икону, ознаку и заставице отклањања грешака. Атрибути manifest-а постављају верзионисање на нивоу пакета, а атрибути application-а дефинишу изглед и понашање апликације у целини. Вредности могу бити референце на ресурсе кроз @-синтаксу или стринг литерали.
<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">
<!-- Компоненте апликације -->
</application>
</manifest>
Таг meta-data унутар application-а омогућава чување произвољних парова кључ-вредност. Ово је згодно за конфигурацију библиотека трећих страна: API кључева, адреса endpoint-а и заставица функционалности. Подаци из meta-data-а су доступни кроз PackageManager.getApplicationInfo().metaData у време извршавања. На пример, Firebase и Google Maps користе meta-data за пренос приступних кључева без тврдог кодирања у изворном коду. Кључеви се наводе у манифесту и могу се разликовати за различите варијанте компајлирања.
Атрибут android:extractNativeLibs управља издвајањем изворних библиотека из APK-а. За апликације са targetSdk 34+ овај атрибут мора бити експлицитно наведен, иначе компајлирање може пасти са грешком INSTALL_FAILED_INVALID_APK. Ако је extractNativeLibs=false, изворне библиотеке остају унутар APK-а без распакивања, што смањује величину инсталиране апликације, али повећава време учитавања библиотека. За већину модерних апликација препоручује се extractNativeLibs=false ради смањења заузетог простора на диску корисника.
Атрибут android:networkSecurityConfig омогућава навођење фајла конфигурације мрежне сигурности. Ово је посебно важно за апликације са targetSdk 28+, где је HTTP саобраћај подразумевано блокиран. Конфигурациони фајл одређује поуздане сертификате, домене за HTTP конекције и правила причвршћивања сертификата. Ово замењује застарели атрибут android:usesCleartextTraffic и пружа флексибилнији механизам управљања сигурношћу конекција на нивоу оперативног система.
Атрибут android:largeHeap захтева увећану величину хипа за апликацију. Подразумевано, Android додељује свакој апликацији ограничену количину меморије, која зависи од уређаја и верзије оперативног система. Ако апликација ради са тешким сликама, видеом или великим скуповима података, largeHeap може спречити OutOfMemoryError. Међутим, злоупотреба овог атрибута је штетна: апликација са великом потрошњом меморије се брже завршава од стране система при недостатку ресурса. Користите largeHeap само након профилисања и потврде неопходности.
Често постављана питања
Од Android 12, недостатак атрибута exported уз присуство intent-filter-а изазива грешку компајлирања. Систем захтева експлицитно навођење видљивости сваке компоненте са intent-filter-ом — ово је сигурносна мера за спречавање случајног отварања компоненти од стране других апликација. За Activity без intent-filter-а exported је подразумевано false.
Да, али у лаунчеру ће се приказати више икона апликације. Свака Activity са MAIN/LAUNCHER постаје засебна улазна тачка. Ово се користи за креирање пречица до различитих делова апликације, на пример за директан прелазак на подешавања или креирање новог записа. Свака икона отвара одговарајућу Activity директно.
Android спаја манифесте из библиотека са главним манифестом апликације. При конфликту атрибута користи се tools:replace или tools:node="merge" за решавање. Овај механизам је аутоматски: при додавању библиотеке кроз Gradle, њен манифест се стапа са главним. Да бисте отказали или заменили атрибут из библиотеке, користите tools:node="remove" или tools:replace="attributeName".
Типични разлози: дозвола није декларисана у манифесту кроз uses-permission, користи се дозвола нормалног нивоа (без захтева у време извршавања), корисник је изабрао „Не питај поново" и дозвола је заувек одбијена, или targetSdkVersion је испод 23, где се дозволе траже приликом инсталације. За дијагностику проверите манифест и дневнике кроз adb logcat.
Атрибут android:debuggable укључује отклањање грешака апликације кроз ADB. За издавачке верзије у Google Play-у мора бити false. Ако је debuggable=true у издавачкој верзији, нападач се може повезати на апликацију кроз ADB, читати податке и извршавати произвољан код. Google Play аутоматски блокира објављивање верзија са debuggable=true.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође