AndroidManifest.xml, her Android uygulaması için bileşenlerini, izinlerini ve meta verilerini tanımlayan zorunlu bir yapılandırma dosyasıdır. Android sistemi, her uygulamayı yüklerken ve başlatırken bu dosyayı okur. Android Developers, 2025'e göre, doğru bir manifest olmadan uygulama cihaza yüklenemez. AndroidManifest.xml, işletim sistemi için Activity, Service, BroadcastReceiver ve ContentProvider'ı kaydeder.
Önemli Noktalar
AndroidManifest.xml, her Android projesinin app/src/main dizininde bulundurması gereken, XML formatındaki kök yapılandırma dosyasıdır. Android sistemi, herhangi bir uygulama kodunu çalıştırmadan önce — yükleme sırasında APK ayrıştırması sırasında — bunu ayrıştırır. Manifestte sözdizimi hatası varsa veya zorunlu bir bildirim eksikse, yükleme bir hata mesajıyla durdurulur.
Dosya, uygulamanın tam bir bildirimini içerir: tüm bileşenlerin listesi (Activity, Service, BroadcastReceiver, ContentProvider), istenen izinler, minimum SDK sürümü, donanım gereksinimleri ve tema ve stil yapılandırması. Sistem veya diğer uygulamalar tarafından çağrılabilen her bileşen, manifestte açıkça bildirilmelidir. Bu bir güvenlik gereksinimidir: açık bir bildirim olmadan bileşen çağrılamaz.
Doğru yapılandırılmış bir manifest olmadan uygulama Google Play veya sideloading yoluyla yüklenemez. Sistem, APK ayrıştırması sırasında manifesti kontrol eder ve hatalar varsa yüklemeyi reddeder. Google Play ayrıca güvensiz yapılandırmalar için manifesti tarar: intent-filter olmayan bir bileşende exported=true ise bir uyarı verilir ve targetSdk 34+ için zorunlu izinler eksikse yayınlama engellenir. Bu nedenle, manifest yapısını anlamak Android geliştiricileri için zorunlu bir beceridir.
Her Android uygulama bileşeni, manifestte açıkça kaydedilmelidir. Bu, dört bileşen türünün tümü için zorunlu bir platform gereksinimidir. Kayıt olmadan, bileşen sistem tarafından oluşturulamaz ve başlatılmaya çalışılırsa ActivityNotFoundException veya benzer bir istisna oluşur. Bileşenler, çalışmalarını etkilemeyen bir sırayla application etiketi içinde kaydedilir.
activity etiketi, bir uygulama ekranını kaydeder. exported özelliği, diğer uygulamaların bu Activity'yi başlatıp başlatamayacağını belirler. Android 12'den itibaren, intent-filter varken exported'ın olmaması derleme hatasına neden olur — bu bir güvenlik gereksinimidir. Giriş noktası, MAIN eylemi ve LAUNCHER kategorisiyle intent-filter aracılığıyla ayarlanır. Her Activity, tam veya göreceli sınıf adıyla eşleşen benzersiz bir android:name'e sahip 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 etiketi, bir arka plan hizmetini tanımlar. Android 8'den itibaren, arka plan hizmetlerinin katı sınırlamaları vardır: bir foreground hizmeti, simgeyle birlikte kullanıcı tarafından görülebilen zorunlu bir bildirim gerektirir ve bound hizmet, yalnızca bir istemci ona bağlı olduğu sürece yaşar. Bildirim olmadan arka planda çalışan hizmetler, uygulama arka plana geçtikten sonra birkaç dakika içinde sistem tarafından otomatik olarak sonlandırılır. Uzun süreli görevler için Service yerine WorkManager kullanın.
<service
android:name=".SyncService"
android:exported="false"
android:foregroundServiceType="dataSync" />
receiver etiketi, sistem veya özel yayın mesajları için bir alıcı bildirir. Android 8'den itibaren, örtük yayınların çoğu artık manifestte statik olarak bildirilen alıcılara iletilmez. Bunun yerine, kod içinde Context.registerReceiver aracılığıyla alıcıların dinamik olarak kaydedilmesi önerilir. İstisnalar arasında, manifestte hala statik kayıt gerektiren BOOT_COMPLETED gibi bazı sistem yayınları bulunur.
<receiver
android:name=".ConnectivityReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Android'deki her tehlikeli izin, uses-permission etiketi aracılığıyla manifestte bir bildirim gerektirir. Android 6'dan itibaren, tehlikeli izinler çalışma zamanında kullanıcıyla bir diyalog aracılığıyla istenir, ancak manifestteki bildirim zorunlu olmaya devam eder. Bu olmadan, requestPermissions yöntemi bir SecurityException fırlatır. INTERNET ve ACCESS_NETWORK_STATE gibi normal düzey izinler, yükleme sırasında otomatik olarak verilir.
| İzin | Amaç |
|---|---|
| CAMERA | Fotoğraf ve video için cihaz kamerasına erişim |
| ACCESS_FINE_LOCATION | GPS ve ağ üzerinden hassas coğrafi konum |
| RECORD_AUDIO | Cihaz mikrofonundan ses kaydı |
| READ_CONTACTS | Telefon rehberinden kişileri okuma |
| POST_NOTIFICATIONS | Android 13+'te bildirim gönderme |
uses-permission-sdk-23 etiketi, yalnızca Android 6.0+'da gerekli olan izinleri belirtir. Bu, var olmayan izinleri istemeden eski sürümlerle uyumluluğu korumayı sağlar. Örneğin, POST_NOTIFICATIONS yalnızca Android 13+'ta kullanılabilir, bu nedenle eski cihazlarda bilinmeyen izin hatasını önlemek için uses-permission-sdk-33 aracılığıyla belirtilmelidir. uses-permission'daki maxSdkVersion özelliği, uygulamayı daha yeni Android sürümlerinde güncellerken gereksiz izinlerin otomatik olarak iptal edilmesini sağlar.
Normal düzey izinler (INTERNET, ACCESS_NETWORK_STATE) yükleme sırasında otomatik olarak verilir ve çalışma zamanı isteği gerektirmez. Bunlar da uses-permission aracılığıyla bildirilir ancak kullanıcıya bir diyalogda gösterilmez. Diğer uygulamalardan uygulama bileşenlerine erişimi kontrol etmek için, izin korumalı bileşenler mekanizması kullanılır: Activity veya Service düzeyinde, bileşen dışarıdan çağrıldığında sistem tarafından kontrol edilecek özel bir izin belirtebilirsiniz. Bu, süreçler arası iletişim için ek bir güvenlik katmanı sağlar.
Manifestteki intent-filter etiketi, bir bileşenin hangi örtük intent'leri işleyebileceğini bildirir. Bu, Android'in sistem veya özel eylemleri uygulamaya bağladığı mekanizmadır. Bir intent filter üç öğeden oluşur: eylem (action), kategori (category) ve veri (data). Üçü de, bileşenin hangi intent'leri alması gerektiğinin kesin olarak tanımlanması için birleştirilebilir. Sistem, en spesifik filtreye göre uygun bileşeni seçer.
<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 özelliği, Android App Links doğrulamasını etkinleştirir: sistem, alan adı sahipliğini onaylamak için sunucuyla iletişime geçer. Doğrulama olmadan, derin bağlantılar, kullanıcının bağlantıyı hangi uygulamayla açacağını seçtiği standart seçici diyalog aracılığıyla çalışır. Başarılı doğrulamadan sonra, bağlantılar diyalog olmadan doğrudan uygulamada açılır. Google Search Console da derin bağlantıları indekslemek ve arama sonuçlarında göstermek için autoVerify kullanır.
action.VIEW ve DEFAULT ile BROWSABLE kategorilerine sahip filtreler, tarayıcılardan, e-postalardan ve diğer uygulamalardan gelen bağlantıları işler. Bu, Android'de derin bağlantıları uygulamanın ana mekanizmasıdır. myapp:// gibi özel URL şemalarını desteklemek için, ana bilgisayar olmadan yalnızca şema belirtmeniz yeterlidir. Ancak Google, özel şemalar yerine HTTPS derin bağlantılarını kullanmanızı önerir çünkü bunlar daha güvenlidir ve ek izin gerektirmez. Özel şemalar, aynı şemayı kaydeden herhangi bir uygulama tarafından ele geçirilebilir.
Kök manifest etiketi, paket, sürüm ve SDK özelliklerini içerir. application etiketi, genel ayarları saklar: tema, simge, etiket ve hata ayıklama bayrakları. Manifest özellikleri, paket düzeyinde sürümlemeyi tanımlarken, application özellikleri uygulamanın genel görünümünü ve davranışını belirler. Değerler, @ sözdizimi aracılığıyla kaynak başvuruları veya dize değişmezleri olabilir.
<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">
<!-- Uygulama bileşenleri -->
</application>
</manifest>
application içindeki meta-data etiketi, rastgele anahtar-değer çiftlerini saklamanıza olanak tanır. Bu, üçüncü taraf kitaplıkları yapılandırmak için kullanışlıdır: API anahtarları, uç nokta URL'leri ve özellik bayrakları. meta-data'dan gelen verilere çalışma zamanında PackageManager.getApplicationInfo().metaData aracılığıyla erişilebilir. Örneğin, Firebase ve Google Maps, kaynak kodda sabit kodlama yapmadan erişim anahtarlarını iletmek için meta-data kullanır. Bunun yerine, anahtarlar manifestte ayarlanır ve farklı derleme çeşitleri için farklılık gösterebilir.
android:extractNativeLibs özelliği, yerel kitaplıkların APK'dan çıkarılmasını kontrol eder. targetSdk 34+ olan uygulamalar için bu özellik açıkça belirtilmelidir, aksi takdirde derleme INSTALL_FAILED_INVALID_APK hatasıyla başarısız olabilir. extractNativeLibs=false ise, yerel kitaplıklar açılmadan APK içinde kalır, bu da yüklü uygulama boyutunu azaltır ancak kitaplık yükleme süresini artırır. Çoğu modern uygulama için, kullanıcının cihazında disk alanı kullanımını azaltmak amacıyla extractNativeLibs=false önerilir.
android:networkSecurityConfig özelliği, bir ağ güvenliği yapılandırma dosyası belirtmenize olanak tanır. Bu, HTTP trafiğinin varsayılan olarak engellendiği targetSdk 28+ olan uygulamalar için özellikle önemlidir. Yapılandırma dosyası, güvenilir sertifikaları, HTTP bağlantıları için alan adlarını ve sertifika sabitleme kurallarını tanımlar. Bu, eski android:usesCleartextTraffic özelliğinin yerini alır ve işletim sistemi düzeyinde bağlantı güvenliğini yönetmek için daha esnek bir mekanizma sağlar.
android:largeHeap özelliği, uygulama için artırılmış bir yığın boyutu ister. Varsayılan olarak Android, her uygulamaya cihaza ve işletim sistemi sürümüne bağlı olarak sınırlı miktarda bellek ayırır. Uygulama ağır görseller, videolar veya büyük veri kümeleriyle çalışıyorsa, largeHeap OutOfMemoryError'ı önleyebilir. Ancak, bu özelliğin kötüye kullanılması zararlıdır: yüksek bellek tüketimi olan bir uygulama, kaynaklar azaldığında sistem tarafından daha hızlı sonlandırılır. largeHeap'i yalnızca profil oluşturma ve ihtiyacı onayladıktan sonra kullanın.
Sıkça Sorulan Sorular
Android 12'den itibaren, intent-filter varken exported özelliğinin olmaması derleme hatasına neden olur. Sistem, intent-filter'e sahip her bileşen için açık görünürlük ister — bu, bileşenlerin diğer uygulamalara yanlışlıkla açılmasını önlemek için bir güvenlik önlemidir. intent-filter olmayan bir Activity için exported varsayılan olarak false'dur.
Evet, ancak başlatıcı birden çok uygulama simgesi görüntüler. MAIN/LAUNCHER'a sahip her Activity ayrı bir giriş noktası olur. Bu, uygulamanın farklı bölümlerine kısayollar oluşturmak için kullanılır, örneğin doğrudan ayarlara gitmek veya yeni bir kayıt oluşturmak için. Her simge, ilgili Activity'yi doğrudan açar.
Android, kitaplıklardan gelen manifestleri ana uygulama manifesti ile birleştirir. Özellik çakışmaları durumunda, bunları çözmek için tools:replace veya tools:node='merge' kullanılır. Bu mekanizma otomatiktir: Gradle aracılığıyla bir kitaplık eklendiğinde, manifesti ana manifestle birleşir. Bir kitaplıktan bir özelliği geçersiz kılmak veya değiştirmek için tools:node='remove' veya tools:replace='attributeName' kullanın.
Tipik nedenler: izin manifestte uses-permission aracılığıyla bildirilmemiştir, normal düzey bir izindir (çalışma zamanı isteği gerekmez), kullanıcı “Tekrar sorma” seçeneğini seçmiştir ve izin kalıcı olarak reddedilmiştir veya targetSdkVersion, izinlerin yükleme sırasında istendiği 23'ün altındadır. Teşhis için, manifesti ve adb logcat aracılığıyla günlükleri kontrol edin.
android:debuggable özelliği, ADB aracılığıyla uygulama hata ayıklamayı etkinleştirir. Google Play'deki sürüm derlemeleri için false olmalıdır. Bir sürüm derlemesinde debuggable=true ise, bir saldırgan ADB aracılığıyla uygulamaya bağlanabilir, veri okuyabilir ve rastgele kod çalıştırabilir. Google Play, debuggable=true olan derlemelerin yayınlanmasını otomatik olarak engeller.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun