Uygulama manifestine genel bakış

Her uygulama projesinin, proje kaynak kümesinin kök dizininde tam olarak bu ada sahip bir AndroidManifest.xml dosyası olmalıdır. Manifest dosyası, Android derleme araçlarına, Android işletim sistemine ve Google Play'e uygulamanızla ilgili temel bilgileri açıklar.

Manifest dosyası, diğer birçok şeyin yanı sıra aşağıdakileri bildirmek için gereklidir:

  • Tüm aktiviteler, hizmetler, yayın alıcılar ve içerik sağlayıcılar dahil olmak üzere uygulamanın bileşenleri. Her bileşen, Kotlin veya Java sınıfının adı gibi temel özellikleri tanımlamalıdır. Ayrıca, hangi cihaz yapılandırmalarını işleyebileceği gibi özellikleri ve bileşenin nasıl başlatılabileceğini açıklayan amaç filtrelerini de bildirebilir. Uygulama bileşenleri hakkında daha fazla bilgiyi sonraki bölümde bulabilirsiniz.
  • Uygulamanın, sistemin korumalı bölümlerine veya diğer uygulamalara erişmek için ihtiyaç duyduğu izinler. Ayrıca, diğer uygulamaların bu uygulamanın içeriğine erişmek için sahip olması gereken izinleri de bildirir. İzinler hakkında daha fazla bilgiyi sonraki bölümde bulabilirsiniz.
  • Uygulamanın gerektirdiği donanım ve yazılım özellikleri. Bu özellikler, uygulamanın Google Play'den hangi cihazlara yüklenebileceğini etkiler. Cihaz uyumluluğu hakkında daha fazla bilgiyi sonraki bölümde bulabilirsiniz.

Uygulamanızı oluşturmak için Android Studio'yu kullanıyorsanız manifest dosyası sizin için oluşturulur ve uygulamanızı oluştururken, özellikle kod şablonlarını kullanırken gerekli manifest öğelerinin çoğu eklenir.

Dosya özellikleri

Aşağıdaki bölümlerde, uygulamanızın en önemli özelliklerinden bazılarının manifest dosyasına nasıl yansıtıldığı açıklanmaktadır.

Uygulama bileşenleri

Uygulamanızda oluşturduğunuz her uygulama bileşeni için manifest dosyasında karşılık gelen bir XML öğesi bildirin:

Bu bileşenlerden herhangi birini manifest dosyasında bildirmeden alt sınıfa ayırırsanız sistem bunu başlatamaz.

Tam paket tanımını kullanarak name özelliğiyle alt sınıfınızın adını belirtin. Örneğin, bir Activity alt sınıfı şu şekilde tanımlanır:

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

Ancak name değerindeki ilk karakter nokta ise modül düzeyindeki build.gradle dosyasının namespace özelliğinden alınan uygulamanın ad alanı, adın önüne eklenir. Örneğin, ad alanı "com.example.myapp" ise aşağıdaki etkinlik adı com.example.myapp.MainActivity olarak çözümlenir:

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

Paket adını veya ad alanını ayarlama hakkında daha fazla bilgi için Ad alanını ayarlama başlıklı makaleyi inceleyin.

Alt paketlerde bulunan uygulama bileşenleriniz varsa (ör. com.example.myapp.purchases), name değeri eksik alt paket adlarını (ör. ".purchases.PayActivity") eklemeli veya tam nitelikli paket adını kullanmalıdır.

Niyet filtreleri

Uygulama etkinlikleri, hizmetleri ve yayın alıcıları amaçlar tarafından etkinleştirilir. Amaç, üzerinde işlem yapılacak veriler, işlemi gerçekleştirmesi beklenen bileşenin kategorisi ve diğer talimatlar dahil olmak üzere, gerçekleştirilecek bir işlemi açıklayan bir Intent nesnesi tarafından tanımlanan bir mesajdır.

Bir uygulama sisteme bir amaç gönderdiğinde sistem, her uygulamanın manifest dosyasındaki intent filtresi bildirimlerine göre amacı işleyebilecek bir uygulama bileşeni bulur. Sistem, eşleşen bileşenin bir örneğini başlatır ve Intent nesnesini bu bileşene iletir. Amacı işleyebilen birden fazla uygulama varsa kullanıcı, hangi uygulamayı kullanacağını seçebilir.

Bir uygulama bileşeni, herhangi bir sayıda amaç filtresine (<intent-filter> öğesiyle tanımlanır) sahip olabilir. Bu filtrelerin her biri, söz konusu bileşenin farklı bir özelliğini tanımlar.

Daha fazla bilgi için Intents and Intent Filters (Amaçlar ve Amaç Filtreleri) başlıklı belgeye bakın.

Simgeler ve etiketler

Bir dizi manifest öğesi, ilgili uygulama bileşeni için kullanıcılara sırasıyla küçük bir simge ve metin etiketi göstermek üzere icon ve label özelliklerine sahiptir.

Her durumda, bir üst öğede ayarlanan simge ve etiket, tüm alt öğeler için varsayılan icon ve label değeri olur. Örneğin, <application> öğesinde ayarlanan simge ve etiket, uygulamanın tüm bileşenleri (ör. tüm etkinlikler) için varsayılan simge ve etikettir.

Bir bileşenin <intent-filter> bölümünde ayarlanan simge ve etiket, bu bileşen bir amaca ulaşmak için seçenek olarak sunulduğunda kullanıcıya gösterilir. Bu simge, varsayılan olarak üst bileşen için bildirilen simgeden (<activity> veya <application> öğesi) devralınır.

Seçici iletişim kutusunda daha iyi belirtmek istediğiniz benzersiz bir işlem sağlayan amaç filtresinin simgesini değiştirmek isteyebilirsiniz. Daha fazla bilgi için Diğer uygulamaların etkinliğinizi başlatmasına izin verme başlıklı makaleyi inceleyin.

İzinler

Android uygulamaları, kişiler ve SMS gibi hassas kullanıcı verilerine veya kamera ve internet erişimi gibi belirli sistem özelliklerine erişmek için izin istemelidir. Her izin, benzersiz bir etiketle tanımlanır. Örneğin, SMS mesajları göndermesi gereken bir uygulamanın manifestinde aşağıdaki satır bulunmalıdır:

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

Android 6.0 (API düzeyi 23) sürümünden itibaren kullanıcı, bazı uygulama izinlerini çalışma zamanında onaylayabilir veya reddedebilir. Ancak uygulamanız hangi Android sürümünü destekliyor olursa olsun, manifestteki <uses-permission> öğesiyle tüm izin isteklerini bildirmeniz gerekir. İzin verilirse uygulama, korumalı özellikleri kullanabilir. Aksi takdirde, bu özelliklere erişme girişimleri başarısız olur.

Uygulamanız, kendi bileşenlerini de izinlerle koruyabilir. android.Manifest.permission bölümünde listelendiği gibi, Android tarafından tanımlanan izinlerden herhangi birini veya başka bir uygulamada beyan edilen bir izni kullanabilir. Uygulamanız kendi izinlerini de tanımlayabilir. <permission> öğesiyle yeni bir izin bildirilir.

Daha fazla bilgi için Android'de izinler başlıklı makaleyi inceleyin.

Cihaz uyumluluğu

Manifest dosyası, uygulamanızın hangi donanım veya yazılım özelliklerini gerektirdiğini ve dolayısıyla uygulamanızın hangi cihaz türleriyle uyumlu olduğunu beyan edebileceğiniz yerdir. Google Play Store, kullanıcıların uygulamanızın gerektirdiği özellikleri veya sistem sürümünü sağlamayan cihazlara uygulamanızı yüklemesine izin vermez.

Uygulamanızın hangi cihazlarla uyumlu olduğunu tanımlayan çeşitli manifest etiketleri vardır. En yaygın olanlardan bazıları aşağıda verilmiştir.

<uses-feature>

<uses-feature> öğesi, uygulamanızın ihtiyaç duyduğu donanım ve yazılım özelliklerini bildirmenize olanak tanır. Örneğin, uygulamanız pusula sensörü olmayan bir cihazda temel işlevleri yerine getiremiyorsa aşağıdaki manifest etiketiyle pusula sensörünün gerekli olduğunu belirtebilirsiniz:

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

Not: Uygulamanızı Chromebook'larda kullanılabilir hale getirmek istiyorsanız göz önünde bulundurmanız gereken bazı önemli donanım ve yazılım özelliği sınırlamaları vardır. Daha fazla bilgi için Chromebook'lar için uygulama manifest uyumluluğu başlıklı makaleyi inceleyin.

<uses-sdk>

Birbirini takip eden her platform sürümünde genellikle önceki sürümde bulunmayan yeni API'ler eklenir. Uygulamanızın uyumlu olduğu minimum sürümü belirtmek için manifest dosyanızda <uses-sdk> etiketi ve minSdkVersion özelliği bulunmalıdır.

Ancak <uses-sdk> öğesindeki özelliklerin, build.gradle dosyasındaki ilgili özellikler tarafından geçersiz kılındığını unutmayın. Bu nedenle, Android Studio kullanıyorsanız minSdkVersion ve targetSdkVersion değerlerini burada belirtin:

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

build.gradle dosyası hakkında daha fazla bilgi edinmek için derlemenizi nasıl yapılandıracağınız hakkında bilgi edinin.

Uygulamanızın farklı cihazları desteklediğini beyan etme hakkında daha fazla bilgi edinmek için Cihaz uyumluluğuna genel bakış başlıklı makaleyi inceleyin.

Dosya kuralları

Bu bölümde, genellikle manifest dosyasındaki tüm öğeler ve özellikler için geçerli olan kurallar ve sözleşmeler açıklanmaktadır.

Öğeler
Yalnızca <manifest> ve <application> öğeleri gereklidir. Her biri yalnızca bir kez kullanılmalıdır. Diğer öğelerin çoğu sıfır veya daha fazla kez oluşabilir. Ancak manifest dosyasının yararlı olması için bazılarının bulunması gerekir.

Tüm değerler, bir öğe içindeki karakter verileri olarak değil, özellikler aracılığıyla ayarlanır.

Aynı düzeydeki öğeler genellikle sıralanmaz. Örneğin, <activity>, <provider> ve <service> öğeleri herhangi bir sırada yerleştirilebilir. Bu kuralın iki önemli istisnası vardır:

  • Bir <activity-alias> öğesi, takma ad olduğu <activity> öğesini takip etmelidir.
  • <application> öğesi, <manifest> öğesinin içindeki son öğe olmalıdır.
Özellikler
Teknik olarak tüm özellikler isteğe bağlıdır. Ancak bir öğenin amacını yerine getirebilmesi için birçok özelliğin belirtilmesi gerekir. Gerçekten isteğe bağlı olan özellikler için referans belgelerinde varsayılan değerler belirtilir.

Kök <manifest> öğesinin bazı özellikleri hariç tüm özellik adları android: önekiyle başlar (ör. android:alwaysRetainTaskState). Ön ek evrensel olduğundan dokümanlarda genellikle özelliklere adlarıyla atıfta bulunulurken bu ön ek atlanır.

Birden fazla değer
Birden fazla değer belirtilebiliyorsa öğe, tek bir öğede birden fazla değer listelenmek yerine neredeyse her zaman tekrarlanır. Örneğin, bir amaç filtresi çeşitli işlemleri listeleyebilir:
<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>
Kaynak değerleri
Bazı özelliklerin, kullanıcılara gösterilen değerleri vardır. Örneğin, bir etkinliğin başlığı veya uygulama simgeniz. Bu özelliklerin değeri, kullanıcının diline veya diğer cihaz yapılandırmalarına (ör. cihazın piksel yoğunluğuna göre farklı bir simge boyutu sağlamak için) bağlı olarak değişebilir. Bu nedenle, değerler manifest dosyasına sabit kodlanmak yerine bir kaynaktan veya temadan ayarlanmalıdır. Gerçek değer, farklı cihaz yapılandırmaları için sağladığınız alternatif kaynaklara göre değişebilir.

Kaynaklar, aşağıdaki biçimde değerler olarak ifade edilir:

"@[package:]type/name"

Kaynak uygulamanız tarafından sağlanıyorsa (kitaplık bağımlılığı tarafından sağlanması da dahil, çünkü kitaplık kaynakları sizinkilerle birleştirilir) package adını atlayabilirsiniz. Android çerçevesinden bir kaynak kullanmak istediğinizde geçerli olan tek paket adı android'dır.

type, string veya drawable gibi bir kaynak türüdür. name ise belirli kaynağı tanımlayan addır. Örnek:

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

Projenize kaynak ekleme hakkında daha fazla bilgi için Uygulama kaynaklarına genel bakış başlıklı makaleyi okuyun.

Bunun yerine temada tanımlanan bir değeri uygulamak için ilk karakter @ yerine ? olmalıdır:

"?[package:]type/name"

Dize değerleri
Bir özellik değeri dize olduğunda, karakterlerden çıkış yapmak için çift ters eğik çizgi (\\) kullanın. Örneğin, yeni satır için \\n, Unicode karakter için \\uxxxx kullanın.

Manifest öğeleri referansı

Aşağıdaki tabloda, AndroidManifest.xml dosyasındaki tüm geçerli öğelerin referans belgelerine bağlantılar verilmiştir.

<action> Bir intent filtresine işlem ekler.
<activity> Bir etkinlik bileşenini bildirir.
<activity-alias> Bir etkinlik için takma ad bildirir.
<application> Uygulamayı bildirir.
<category> Bir intent filtresine kategori adı ekler.
<compatible-screens> Uygulamanın uyumlu olduğu her ekran yapılandırmasını belirtir.
<data> Bir amaç filtresine veri spesifikasyonu ekler.
<grant-uri-permission> Üst içerik sağlayıcının erişim izni olan uygulama verilerinin alt kümelerini belirtir.
<instrumentation> Bir uygulamanın sistemle etkileşimini izlemenize olanak tanıyan bir Instrumentation sınıfı bildirir.
<intent-filter> Bir etkinliğin, hizmetin veya yayın alıcının yanıt verebileceği amaç türlerini belirtir.
<manifest> AndroidManifest.xml dosyasının kök öğesi.
<meta-data> Üst bileşene sağlanabilecek ek, rastgele verilerden oluşan bir öğe için ad-değer çifti.
<path-permission> İçerik sağlayıcıdaki belirli bir veri alt kümesi için yolu ve gerekli izinleri tanımlar.
<permission> Bu veya diğer uygulamaların belirli bileşenlerine ya da özelliklerine erişimi sınırlamak için kullanılabilecek bir güvenlik izni bildirir.
<permission-group> İlgili izinlerin mantıksal gruplandırması için bir ad bildirir.
<permission-tree> İzin ağacının temel adını bildirir.
<provider> İçerik sağlayıcı bileşenini bildirir.
<queries> Uygulamanızın erişmeyi planladığı diğer uygulamaların kümesini belirtir. Paket görünürlüğü filtreleme hakkındaki rehberden daha fazla bilgi edinin.
<receiver> Bir yayın alıcı bileşeni bildirir.
<service> Bir hizmet bileşeni bildirir.
<supports-gl-texture> Uygulamanın desteklediği tek bir GL doku sıkıştırma biçimini bildirir.
<supports-screens> Uygulamanızın desteklediği ekran boyutlarını belirtir ve uygulamanızın desteklediği ekranlardan daha büyük ekranlar için ekran uyumluluğu modunu etkinleştirir.
<uses-configuration> Uygulamanın gerektirdiği belirli giriş özelliklerini gösterir.
<uses-feature> Uygulama tarafından kullanılan tek bir donanım veya yazılım özelliğini bildirir.
<uses-library> Uygulamanın bağlanması gereken paylaşılan kitaplığı belirtir.
<uses-native-library> Uygulamanın bağlanması gereken, satıcı tarafından sağlanan yerel paylaşılan kitaplığı belirtir.
<uses-permission> Uygulamanın doğru şekilde çalışması için kullanıcının vermesi gereken bir sistem iznini belirtir.
<uses-permission-sdk-23> Bir uygulamanın belirli bir izni istediğini belirtir ancak bu izin yalnızca uygulama Android 6.0 (API düzeyi 23) veya sonraki sürümlerin yüklü olduğu bir cihaza yüklenirse geçerlidir.
<uses-sdk> Bir uygulamanın Android platformunun bir veya daha fazla sürümüyle uyumluluğunu bir API düzeyi tam sayısı aracılığıyla ifade etmenizi sağlar.

Sınırlar

Aşağıdaki etiketlerin manifest dosyasında kaç kez kullanılabileceği sınırlıdır:

Etiket Adı Sınır
<package> 1000
<meta-data> 1000
<uses-library> 1000

Aşağıdaki özelliklerin maksimum uzunluğu sınırlıdır:

Özellik Sınır
name 1024
versionName 1024
host 255
mimeType 255

Örnek manifest dosyası

Aşağıdaki XML, uygulama için iki etkinlik bildiren basit bir örnektir AndroidManifest.xml.

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