AndroidManifest.xml hər bir Android tətbiqinin məcburi konfiqurasiya faylıdır, onun komponentlərini, icazələrini və metadatalarını təsvir edir. Android sistemi bu faylı hər bir tətbiqin quraşdırılması və işə salınması zamanı oxuyur. Android Developers, 2025-ə görə, düzgün manifest olmadan tətbiq cihazda quraşdırılmır. AndroidManifest.xml əməliyyat sistemi üçün Activity, Service, BroadcastReceiver və ContentProvider-ı qeydiyyatdan keçirir.
Əsas məqamlar
AndroidManifest.xml XML formatında əsas konfiqurasiya faylıdır ki, hər bir Android layihəsi onu app/src/main kataloqunda saxlamalıdır. Android sistemi onu hər hansı tətbiq kodunu işə salmadan əvvəl — APK-nın pars edilməsi mərhələsində təhlil edir. Əgər manifestdə sintaktik səhv varsa və ya məcburi bəyannamə yoxdursa, quraşdırma səhv mesajı ilə kəsilir.
Fayl tətbiqin tam bəyannaməsini ehtiva edir: bütün komponentlərin siyahısı (Activity, Service, BroadcastReceiver, ContentProvider), tələb olunan icazələr, minimum SDK versiyası, aparat tələbləri və mövzu/stil konfiqurasiyası. Sistem və ya digər tətbiqlər tərəfindən çağırıla bilən hər bir komponent manifestdə açıq şəkildə bəyan edilməlidir. Bu təhlükəsizlik tələbidir: açıq bəyannamə olmadan komponent çağırış üçün əlçatan deyil.
Düzgün konfiqurasiya edilmiş manifest olmadan tətbiq Google Play və ya yan yükləmə vasitəsilə quraşdırıla bilməz. Sistem APK-nın pars edilməsi mərhələsində manifesti yoxlayır və səhvlər olduqda quraşdırmanı rədd edir. Google Play həmçinin təhlükəli konfiqurasiyalar üçün manifesti skan edir: intent-filter olmayan komponentdə exported=true olduqda xəbərdarlıq verilir, targetSdk 34+ üçün məcburi icazələr olmadıqda isə nəşr bloklanır. Buna görə də manifest strukturunu başa düşmək Android tərtibatçısı üçün məcburi bacarıqdır.
Android tətbiqinin hər bir komponenti manifestdə açıq şəkildə qeydiyyatdan keçirilməlidir. Bu, platformanın bütün dörd komponent növü üçün məcburi tələbidir. Qeydiyyat olmadan komponent sistem tərəfindən yaradıla bilməz və onu işə salmaq cəhdi ActivityNotFoundException və ya oxşar istisnaya səbəb olar. Komponentlər application teqi daxilində onların işinə təsir etməyən ardıcıllıqla qeydiyyatdan keçirilir.
activity teqi tətbiqin ekranını qeydiyyatdan keçirir. exported atributu digər tətbiqlərin bu Activity-ni işə sala biləcəyini müəyyən edir. Android 12-dən başlayaraq, intent-filter olduqda exported atributunun olmaması kompilasiya xətasına səbəb olur — bu təhlükəsizlik tələbidir. Giriş nöqtəsi MAIN action və LAUNCHER category ilə intent-filter vasitəsilə təyin edilir. Hər bir Activity sinifin tam və ya nisbi adına uyğun unikal android:name-ə malik olmalıdır.
<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 teqi fon xidmətini təyin edir. Android 8-dən başlayaraq, fon xidmətlərinin ciddi məhdudiyyətləri var: foreground service istifadəçiyə görünən işarəli məcburi bildiriş tələb edir, bound service isə yalnız bağlı müştəri olduqda işləyir. Bildirişsiz fonda işləyən xidmətlər tətbiq fon rejiminə keçdikdən bir neçə dəqiqə sonra sistem tərəfindən avtomatik dayandırılır. Uzunmüddətli tapşırıqlar üçün Service əvəzinə WorkManager istifadə edin.
<service
android:name=".SyncService"
android:exported="false"
android:foregroundServiceType="dataSync" />
receiver teqi sistem və ya fərdi yayım mesajlarının qəbuledicisini bəyan edir. Android 8-dən başlayaraq, qeyri-aşkar yayımların əksəriyyəti manifestdə statik olaraq bəyan edilmiş qəbulediciələrə çatdırılmır. Bunun əvəzinə qəbulediciələrin koddakı Context.registerReceiver vasitəsilə dinamik qeydiyyatdan keçirilməsi tövsiyə olunur. İstisna, BOOT_COMPLETED kimi hələ də manifestdə statik qeydiyyat tələb edən bəzi sistem yayımlarıdır.
<receiver
android:name=".ConnectivityReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Android-də hər bir təhlükəli icazə manifestdə uses-permission teqi vasitəsilə bəyan edilməlidir. Android 6-dan başlayaraq, təhlükəli icazələr istifadəçi ilə dialoq vasitəsilə icra zamanı tələb olunur, lakin manifestdə bəyannamə məcburi olaraq qalır. Olmadan requestPermissions metodu SecurityException istisnası atır. INTERNET və ACCESS_NETWORK_STATE kimi normal səviyyəli icazələr quraşdırma zamanı avtomatik verilir.
| İcazə | Təyinat |
|---|---|
| CAMERA | Foto və video üçün cihazın kamerasına giriş |
| ACCESS_FINE_LOCATION | GPS və şəbəkə vasitəsilə dəqiq geolokasiya |
| RECORD_AUDIO | Cihazın mikrofonundan səs yazısı |
| READ_CONTACTS | Telefon kitabçasından kontaktların oxunması |
| POST_NOTIFICATIONS | Android 13+-da bildirişlərin göndərilməsi |
uses-permission-sdk-23 teqi yalnız Android 6.0+-da tələb olunan icazələri göstərir. Bu, mövcud olmayan icazələri tələb etmədən köhnə versiyalarla uyğunluğu qorumağa imkan verir. Məsələn, POST_NOTIFICATIONS yalnız Android 13+-da mövcuddur, buna görə də onu uses-permission-sdk-33 vasitəsilə göstərmək lazımdır ki, köhnə cihazlarda naməlum icazə xətası olmasın. uses-permission-da maxSdkVersion atributu tətbiqin yeni Android versiyalarında yenilənməsi zamanı lazımsız icazələri avtomatik geri götürməyə imkan verir.
Normal səviyyəli icazələr (INTERNET, ACCESS_NETWORK_STATE) quraşdırma zamanı avtomatik verilir və icra zamanı sorğu tələb etmir. Onlar da uses-permission vasitəsilə bəyan edilir, lakin istifadəçiyə dialoqda göstərilmir. Digər tətbiqlərdən tətbiq komponentlərinə girişi idarə etmək üçün permission-protected components mexanizmi istifadə olunur: Activity və ya Service səviyyəsində fərdi icazə təyin edilə bilər ki, bu da komponent kənardan çağırıldıqda sistem tərəfindən yoxlanılır. Bu, proseslərarası qarşılıqlı əlaqə üçün əlavə təhlükəsizlik səviyyəsi təmin edir.
Manifestdə intent-filter teqi komponentin hansı qeyri-aşkar intentləri emal edə biləcəyini bəyan edir. Bu, Android-in sistem və ya fərdi hərəkətləri tətbiqlə əlaqələndirdiyi mexanizmdir. Intent filter üç elementdən ibarətdir: action (hərəkət), category (kateqoriya) və data (məlumat). Hər üçü komponentin hansı intentləri qəbul etməli olduğunu dəqiq təsvir etmək üçün birləşdirilə bilər. Sistem ən spesifik filtr əsasında uyğun komponenti seçir.
<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 atributu Android App Links yoxlamasını aktivləşdirir: sistem domen sahibliyini təsdiqləmək üçün serverlə əlaqə saxlayır. Yoxlama olmadan dərin linklər standart seçim dialoqu vasitəsilə işləyir, burada istifadəçi linki hansı tətbiqlə açacağını seçir. Uğurlu yoxlamadan sonra linklər dialoq olmadan birbaşa tətbiqdə açılır. Google Search Console da deep link-lərin indeksləşdirilməsi və axtarış nəticələrində göstərilməsi üçün autoVerify-dən istifadə edir.
action.VIEW və DEFAULT və BROWSABLE kateqoriyaları olan filtrlər brauzer, e-poçt və digər tətbiqlərdən gələn linkləri emal edir. Bu, Android-də dərin linklərin həyata keçirilməsinin əsas mexanizmidir. myapp:// kimi fərdi URL sxemlərini dəstəkləmək üçün host olmadan scheme göstərmək kifayətdir. Lakin Google fərdi sxemlər əvəzinə HTTPS dərin linklərindən istifadə etməyi tövsiyə edir, çünki onlar daha təhlükəsizdir və əlavə icazələr tələb etmir. Fərdi sxemlər eyni sxemi qeydiyyatdan keçirmiş hər hansı tətbiq tərəfindən ələ keçirilə bilər.
manifest əsas teqi paket, versiya və SDK atributlarını ehtiva edir. application teqi qlobal parametrləri saxlayır: mövzu, işarə, etiket və sazlama bayraqları. manifest atributları paket səviyyəsində versiyalaşdırmanı təyin edir, application atributları isə tətbiqin ümumi görünüşünü və davranışını müəyyən edir. Dəyərlər @-sintaksisi ilə resurslara istinadlar və ya sətir literalları ola bilər.
<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">
<!-- Tətbiq komponentləri -->
</application>
</manifest>
application daxilində meta-data teqi ixtiyari açar-dəyər cütlərini saxlamağa imkan verir. Bu, üçüncü tərəf kitabxanalarının konfiqurasiyası üçün əlverişlidir: API açarları, endpoint ünvanları və funksionallıq bayraqları. meta-data məlumatları icra zamanı PackageManager.getApplicationInfo().metaData vasitəsilə əlçatandır. Məsələn, Firebase və Google Maps meta-data-dan giriş açarlarını mənbə kodunda sərt kodlaşdırmadan ötürmək üçün istifadə edir. Açarlar manifestdə təyin edilir və müxtəlif kompilasiya variantları üçün fərqlənə bilər.
android:extractNativeLibs atributu APK-dan yerli kitabxanaların çıxarılmasını idarə edir. targetSdk 34+ olan tətbiqlər üçün bu atribut açıq şəkildə göstərilməlidir, əks halda kompilasiya INSTALL_FAILED_INVALID_APK xətası ilə uğursuz ola bilər. extractNativeLibs=false olduqda, yerli kitabxanalar açılmadan APK daxilində qalır, bu quraşdırılmış tətbiqin ölçüsünü azaldır, lakin kitabxanaların yüklənmə vaxtını artırır. Müasir tətbiqlərin əksəriyyəti üçün istifadəçinin diskində yer saxlamaq üçün extractNativeLibs=false tövsiyə olunur.
android:networkSecurityConfig atributu şəbəkə təhlükəsizliyi konfiqurasiya faylını təyin etməyə imkan verir. Bu, xüsusilə HTTP trafikinin standart olaraq bloklandığı targetSdk 28+ olan tətbiqlər üçün vacibdir. Konfiqurasiya faylı etibarlı sertifikatları, HTTP bağlantıları üçün domenləri və sertifikat pinning qaydalarını müəyyən edir. Bu, köhnəlmiş android:usesCleartextTraffic atributunu əvəz edir və ƏS səviyyəsində bağlantı təhlükəsizliyini idarə etmək üçün daha çevik mexanizm təmin edir.
android:largeHeap atributu tətbiq üçün artırılmış yığın ölçüsü tələb edir. Standart olaraq Android hər tətbiqə cihazdan və ƏS versiyasından asılı olaraq məhdud yaddaş ayırır. Tətbiq ağır şəkillər, video və ya böyük məlumat dəstləri ilə işləyirsə, largeHeap OutOfMemoryError-un qarşısını ala bilər. Lakin bu atributdan sui-istifadə zərərlidir: böyük yaddaş istehlakı olan tətbiq resurs çatışmazlığında sistem tərəfindən daha tez dayandırılır. largeHeap-dən yalnız profilləşdirmədən və zərurəti təsdiqlədikdən sonra istifadə edin.
Tez-tez verilən suallar
Android 12-dən başlayaraq, intent-filter olduqda exported atributunun olmaması kompilasiya xətasına səbəb olur. Sistem intent-filter olan hər bir komponentin görünürlüyünün açıq şəkildə göstərilməsini tələb edir — bu, komponentlərin digər tətbiqlər tərəfindən təsadüfən açılmasının qarşısını almaq üçün təhlükəsizlik tədbiridir. Intent-filter olmayan Activity üçün exported standart olaraq false-dur.
Bəli, lakin launcherdə tətbiqin bir neçə işarəsi göstəriləcək. MAIN/LAUNCHER olan hər Activity ayrıca giriş nöqtəsinə çevrilir. Bu, tətbiqin müxtəlif bölmələrinə, məsələn birbaşa parametrlərə və ya yeni qeyd yaratmağa keçid üçün qısayollar yaratmaq üçün istifadə olunur. Hər işarə müvafiq Activity-ni birbaşa açır.
Android kitabxanalardan olan manifestləri tətbiqin əsas manifesti ilə birləşdirir. Atribut münaqişəsi olduqda həll etmək üçün tools:replace və ya tools:node="merge" istifadə olunur. Bu mexanizm avtomatikdir: Gradle vasitəsilə kitabxana əlavə edildikdə onun manifesti əsas manifestlə birləşdirilir. Kitabxanadan atributu ləğv etmək və ya əvəz etmək üçün tools:node="remove" və ya tools:replace="attributeName" istifadə edin.
Tipik səbəblər: icazə manifestdə uses-permission vasitəsilə bəyan edilməyib, normal səviyyəli icazə istifadə olunur (icra zamanı sorğu tələb etmir), istifadəçi "Bir daha soruşma" seçib və icazə əbədi qadağan edilib, ya da targetSdkVersion 23-dən aşağıdır, burada icazələr quraşdırma zamanı tələb olunur. Diaqnostika üçün manifesti və adb logcat vasitəsilə jurnalları yoxlayın.
android:debuggable atributu ADB vasitəsilə tətbiqin sazlanmasını aktivləşdirir. Google Play-də buraxılış kompilasiyaları üçün false olmalıdır. Əgər buraxılış kompilasiyasında debuggable=true olarsa, təcavüzkar ADB vasitəsilə tətbiqə qoşula, məlumatları oxuya və ixtiyari kod icra edə bilər. Google Play avtomatik olaraq debuggable=true olan kompilasiyaların nəşrini bloklayır.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun