Manifest dosyalarını yönetme

Bu sayfada, manifest birleştirme işleminin işleyiş şekli ve birleştirme çakışmalarını çözmek için birleştirme tercihlerini nasıl uygulayabileceğiniz açıklanmaktadır. Uygulama manifesti dosyasıyla ilgili giriş için uygulama manifestine genel bakış başlıklı makaleyi inceleyin.

Birden fazla manifest dosyasını birleştirme

APK veya Android App Bundle dosyanız yalnızca bir AndroidManifest.xml dosyası içerebilir ancak Android Studio projeniz ana kaynak grubu, derleme varyantları ve içe aktarılan kitaplıklar tarafından sağlanan birkaç manifest dosyası içerebilir. Gradle derlemesi, uygulamanızı derlerken tüm manifest dosyalarını uygulamanıza paketlenen tek bir manifest dosyasında birleştirir.

Manifest birleştirme aracı, özel XML özellikleriyle tanımladığınız birleştirme sezgilerini izleyerek ve birleştirme tercihlerine uyarak her dosyadaki tüm XML öğelerini birleştirir.

İpucu: Birleştirilmiş manifestinizin sonuçlarını önizlemek ve çakışma hatalarını bulmak için aşağıdaki bölümde açıklanan Birleştirilmiş Manifest görünümünü kullanın.

Öncelikleri birleştirme

Birleştirme aracı, tüm manifest dosyalarını her manifest dosyasının önceliğine göre sırayla tek bir dosyada birleştirir. Örneğin, üç manifest dosyanız varsa en düşük öncelikli manifest, en yüksek öncelikli manifest ile birleştirilir ve ardından bu manifest, şekil 1'de gösterildiği gibi en yüksek öncelikli manifest ile birleştirilir.

Şekil 1. Üç manifest dosyasını en düşük öncelikten en yüksek önceliğe doğru birleştirme işlemi.

Birbirleriyle birleştirilebilecek üç temel manifest dosyası türü vardır ve bunların birleştirme öncelikleri aşağıdaki gibidir (en yüksek öncelikli önce):

  1. Derleme varyantınız için manifest dosyası

    Varyantınız için birden fazla kaynak grubunuz varsa bu grupların manifest öncelikleri şu şekildedir:

    • Derleme varyantı manifesti (src/demoDebug/ gibi)
    • Derleme türü manifesti (ör. src/debug/)
    • Ürün türü manifesti (src/demo/ gibi)

      Lezzet boyutları kullanıyorsanız manifest öncelikleri, her boyutun flavorDimensions mülkünde listelenme sırasına karşılık gelir (ilk öncelik en yüksek önceliktir).

  2. Uygulama modülü için ana manifest dosyası
  3. Dahil edilen bir kitaplıktaki manifest dosyası

    Birden fazla kitaplığınız varsa bu kitaplıkların manifest öncelikleri, Gradle dependencies bloğunuzda göründükleri sırayla eşleşir.

Örneğin, bir kitaplık manifesti ana manifestle birleştirilir, ardından ana manifest derleme varyantı manifestiyle birleştirilir. Bunların, Kaynak kümeleriyle oluşturma bölümünde açıklandığı gibi tüm kaynak kümeleri için aynı birleştirme öncelikleri olduğunu unutmayın.

Önemli: build.gradle dosyasından gelen derleme yapılandırmaları, birleştirilmiş manifest dosyasında ilgili tüm özellikleri geçersiz kılar. Örneğin, build.gradle veya build.gradle.kts dosyasından gelen minSdk, <uses-sdk> manifest öğesindeki eşleşen özelliği geçersiz kılar. Karışıklığı önlemek için <uses-sdk> öğesini çıkarın ve bu özellikleri yalnızca build.gradle dosyasında tanımlayın. Daha fazla bilgi için Derlemenizi yapılandırma başlıklı makaleyi inceleyin.

Birleştirme çakışması için buluşsal yöntemler

Birleştirme aracı, bir manifestteki her XML öğesini mantıksal olarak başka bir manifestteki karşılık gelen öğeyle eşleştirebilir. Eşleştirmenin işleyiş şekli hakkında ayrıntılı bilgi için önceki bölümdeki birleştirme öncelikleri bölümüne bakın.

Düşük öncelikli manifest'teki bir öğe, yüksek öncelikli manifest'teki hiçbir öğeyle eşleşmezse birleştirilmiş manifest'e eklenir. Ancak eşleşen bir öğe varsa birleştirme aracı, her öğenin tüm özelliklerini aynı öğede birleştirmeye çalışır. Araç, her iki manifest'in de farklı değerlere sahip aynı özelliği içerdiğini tespit ederse bir birleştirme çakışması meydana gelir.

Tablo 1, birleştirme aracı tüm özellikleri aynı öğede birleştirmeye çalıştığında ortaya çıkabilecek sonuçları gösterir.

Tablo 1. Özellik değerleri için varsayılan birleştirme davranışı

Yüksek öncelikli özellik Düşük öncelikli özellik Özelliğin birleştirilmiş sonucu
Değerli değil Değerli değil Değer yok (varsayılan değer kullanılır)
B değeri B değeri
A değeri Değerli değil A değeri
A değeri A değeri
B değeri Çakışma hatası: Birleştirme kuralı işaretçisi eklemeniz gerekir.

Ancak birleştirme çakışmalarını önlemek için birleştirme aracının farklı davrandığı birkaç durum vardır:

  • <manifest> öğesindeki özellikler hiçbir zaman birleştirilmez. Yalnızca en yüksek öncelikli manifestteki özellikler kullanılır.
  • <uses-feature> ve <uses-library> öğelerindeki android:required özelliği VEYA bir birleştirme kullanır. Çakışma varsa "true" uygulanır ve bir manifest tarafından zorunlu kılınan özellik veya kütüphane her zaman dahil edilir.
  • <uses-sdk> öğesindeki özellikler, aşağıdaki durumlar hariç her zaman daha yüksek öncelikli manifestteki değeri kullanır:
    • Daha düşük öncelikli manifest'in minSdk değeri daha yüksek olduğunda, overrideLibrary birleştirme kuralını uygulamadığınız sürece hata meydana gelir.
    • Daha düşük öncelikli manifest'in targetSdkVersion değeri daha düşük olduğunda, birleştirme aracı daha yüksek öncelikli manifest'teki değeri kullanır ve ayrıca içe aktarılan kitaplığın düzgün şekilde çalışmaya devam etmesini sağlamak için gereken tüm sistem izinlerini de ekler (daha yüksek Android sürümünün izin kısıtlamalarını artırdığı durumlarda). Bu davranış hakkında daha fazla bilgi için örtülü sistem izinleri hakkındaki bölüme bakın.
  • <intent-filter> öğesi, manifestler arasında hiçbir zaman eşleştirilmez. Her biri benzersiz olarak değerlendirilir ve birleştirilmiş manifest'teki ortak üst öğeye eklenir.

Özellikler arasındaki diğer tüm çakışmalar için hata alırsınız ve daha öncelikli manifest dosyasına özel bir özellik ekleyerek birleştirme aracına bu sorunu nasıl çözeceğini bildirmeniz gerekir. Kural işaretçilerini birleştirme ile ilgili aşağıdaki bölüme bakın.

Varsayılan özellik değerlerine güvenmeyin. Tüm benzersiz özellikler aynı öğede birleştirildiğinden, daha yüksek öncelikli manifest aslında bir özelliğin varsayılan değerine bağlıysa ve bunu belirtmezse bu durum beklenmedik sonuçlara neden olabilir. Örneğin, önceliği daha yüksek olan manifest android:launchMode özelliğini tanımlamıyorsa "standard" özelliğinin varsayılan değerini kullanır. Ancak önceliği daha düşük olan manifest bu özelliği farklı bir değerle tanımlarsa bu değer birleştirilen manifest'e uygulanır ve varsayılan değer geçersiz kılınır. Her bir özelliği istediğiniz şekilde açıkça tanımlamanız gerekir. Her bir özelliğin varsayılan değerleri manifest referansında belirtilir.

Kural işaretçilerini birleştirme

Birleştirme kuralı işaretçisi, birleştirme çakışmalarını çözme veya istenmeyen öğeleri ve özellikleri kaldırma konusunda tercihinizi belirtmek için kullanabileceğiniz bir XML özelliğidir. İşaretçiyi bir öğenin tamamına veya yalnızca belirli özelliklerine uygulayabilirsiniz.

İki manifest dosyasını birleştirirken birleştirme aracı, bu işaretçileri daha yüksek öncelikli manifest dosyasında arar.

Tüm işaretçiler Android tools ad alanına aittir. Bu nedenle, önce bu ad alanını <manifest> öğesinde burada gösterildiği gibi belirtmeniz gerekir:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    xmlns:tools="http://schemas.android.com/tools">

Düğüm işaretçileri

Bir XML öğesinin tamamına (belirli bir manifest öğesindeki tüm özelliklere ve tüm alt etiketlerine) bir birleştirme kuralı uygulamak için aşağıdaki özellikleri kullanın:

tools:node="merge"
Çakışmayı birleştirme sezgisel kurallarını kullanarak, bu etiketteki tüm özellikleri ve iç içe yerleştirilmiş tüm öğeleri çakışmazsa birleştirin. Bu, öğeler için varsayılan davranıştır.

Düşük öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Yüksek öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:node="merge">
</activity>

Birleştirilmiş manifest sonucu:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
tools:node="merge-only-attributes"
Yalnızca bu etiketteki özellikleri birleştirin; iç içe yerleştirilmiş öğeleri birleştirmeyin.

Düşük öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <data android:type="image/*" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Yüksek öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:node="merge-only-attributes">
</activity>

Birleştirilmiş manifest sonucu:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateUnchanged">
</activity>
tools:node="remove"
Bu öğeyi birleştirilmiş manifest dosyasından kaldırın. Birleştirilmiş manifestinizde, ihtiyacınız olmayan ve kontrolünüzün dışındaki daha düşük öncelikli bir manifest dosyası (ör. içe aktarılan kitaplık) tarafından sağlanan bir öğe keşfettiğinizde kullanılır.

Düşük öncelikli manifest:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="cow"
      android:value="@string/moo"/>
  <meta-data android:name="duck"
      android:value="@string/quack"/>
</activity-alias>

Yüksek öncelikli manifest:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="cow"
      tools:node="remove"/>
</activity-alias>

Birleştirilmiş manifest sonucu:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="duck"
      android:value="@string/quack"/>
</activity-alias>
tools:node="removeAll"
tools:node="remove"'e benzer ancak bu öğe türüyle eşleşen tüm öğeleri (aynı üst öğe içinde) kaldırır.

Düşük öncelikli manifest:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="cow"
      android:value="@string/moo"/>
  <meta-data android:name="duck"
      android:value="@string/quack"/>
</activity-alias>

Yüksek öncelikli manifest:

<activity-alias android:name="com.example.alias">
  <meta-data tools:node="removeAll"/>
</activity-alias>

Birleştirilmiş manifest sonucu:

<activity-alias android:name="com.example.alias">
</activity-alias>
tools:node="replace"
Daha düşük öncelikli öğeyi tamamen değiştirin. Yani, önceliği düşük olan manifestte eşleşen bir öğe varsa bu öğeyi yoksayın ve bu manifestte göründüğü şekilde kullanın.

Düşük öncelikli manifest:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="cow"
      android:value="@string/moo"/>
  <meta-data android:name="duck"
      android:value="@string/quack"/>
</activity-alias>

Yüksek öncelikli manifest:

<activity-alias android:name="com.example.alias"
    tools:node="replace">
  <meta-data android:name="fox"
      android:value="@string/dingeringeding"/>
</activity-alias>

Birleştirilmiş manifest sonucu:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="fox"
      android:value="@string/dingeringeding"/>
</activity-alias>
tools:node="strict"
Düşük öncelikli manifest'teki bu öğe, yüksek öncelikli manifest'teki öğeyle tam olarak eşleşmediğinde (diğer birleştirme kuralı işaretçisi tarafından çözülmedikçe) derleme hatası oluşturun. Bu işlem, birleştirme anlaşmazlığı sezgisel kurallarını geçersiz kılar. Örneğin, önceliği düşük olan manifest ek bir özellik içeriyorsa derleme başarısız olur (varsayılan davranış ise ek özelliği birleştirilmiş manifest'e ekler).

Düşük öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Yüksek öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:node="strict">
</activity>

Bu durum, manifest birleştirme hatasına neden olur. İki manifest öğesi, katı modda hiç farklı olamaz. Bu farklılıkları çözmek için diğer birleştirme kuralı işaretçisi uygulamanız gerekir. (tools:node="strict" olmadan bu iki dosya, tools:node="strict" örneğinde gösterildiği gibi hatasız bir şekilde birleştirilebilir.)tools:node="merge"

Özellik işaretçileri

Bunun yerine, bir birleştirme kuralını yalnızca manifest etiketindeki belirli özelliklere uygulamak için aşağıdaki özellikleri kullanın. Her özellik, virgülle ayrılmış bir veya daha fazla özellik adını (özellik ad alanı dahil) kabul eder.

tools:remove="attr, ..."
Belirtilen özellikleri birleştirilmiş manifest'den kaldırın. Daha düşük öncelikli manifest dosyası bu özellikleri içerdiğinde ve bunların birleştirilmiş manifest'e eklenmediğinden emin olmak istediğinizde kullanılır.

Düşük öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">

Yüksek öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:remove="android:windowSoftInputMode">

Birleştirilmiş manifest sonucu:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait">
tools:replace="attr, ..."
Daha düşük öncelikli manifest'teki belirtilen özellikleri bu manifest'teki özelliklerle değiştirin. Diğer bir deyişle, her zaman daha yüksek öncelikli manifestin değerlerini koruyun.

Düşük öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:theme="@oldtheme"
    android:exported="false"
    android:windowSoftInputMode="stateUnchanged">

Yüksek öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:theme="@newtheme"
    android:exported="true"
    android:screenOrientation="portrait"
    tools:replace="android:theme,android:exported">

Birleştirilmiş manifest sonucu:

<activity android:name="com.example.ActivityOne"
    android:theme="@newtheme"
    android:exported="true"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateUnchanged">
tools:strict="attr, ..."
Düşük öncelikli manifest'teki bu özellikler, yüksek öncelikli manifest'teki özelliklerle tam olarak eşleşmediğinde derleme hatası oluşturun. Bu, birleştirme çakışması sezgileri bölümünde açıklanan özel davranışlara sahip olanlar hariç tüm özellikler için varsayılan davranıştır.

Düşük öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="landscape">
</activity>

Yüksek öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:strict="android:screenOrientation">
</activity>

Bu durum, manifest birleştirme hatasına neden olur. Çakışmayı çözmek için başka birleştirme kuralı işaretçisi uygulamanız gerekir. Bu varsayılan davranıştır. Bu nedenle, tools:strict="screenOrientation" açıkça eklendiğinde de aynı sonuç elde edilir.

Aşağıdaki örnekte gösterildiği gibi bir öğeye birden fazla işaretçi de uygulayabilirsiniz:

Düşük öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:theme="@oldtheme"
    android:exported="false"
    android:allowTaskReparenting="true"
    android:windowSoftInputMode="stateUnchanged">

Yüksek öncelikli manifest:

<activity android:name="com.example.ActivityOne"
    android:theme="@newtheme"
    android:exported="true"
    android:screenOrientation="portrait"
    tools:replace="android:theme,android:exported"
    tools:remove="android:windowSoftInputMode">

Birleştirilmiş manifest sonucu:

<activity android:name="com.example.ActivityOne"
    android:theme="@newtheme"
    android:exported="true"
    android:allowTaskReparenting="true"
    android:screenOrientation="portrait">

İşaretçi seçici

Birleştirme kuralı işaretçilerini yalnızca belirli bir içe aktarılan kitaplığa uygulamak istiyorsanız tools:selector özelliğini kitaplık paketi adıyla ekleyin.

Örneğin, aşağıdaki manifest'te removebirleştirme kuralı yalnızca daha düşük öncelikli manifest dosyası com.example.lib1 kitaplığından olduğunda uygulanır:

<permission android:name="permissionOne"
    tools:node="remove"
    tools:selector="com.example.lib1">

Önceliği daha düşük olan manifest başka bir kaynaktan geliyorsa remove birleştirme kuralı yoksayılır.

Not: Bu özelliği özellik işaretçilerinden biriyle kullanırsanız işaretçide belirtilen tüm özellikler için geçerli olur.

İçe aktarılan kitaplıklar için <uses-sdk> öğesini geçersiz kılma

Varsayılan olarak, ana manifest dosyasından daha yüksek bir minSdk değerine sahip bir kitaplık içe aktarılırken hata meydana gelir ve kitaplık içe aktarılamaz.

Birleştirme aracının bu çakışmayı yoksaymasını ve uygulamanızın daha düşük minSdk değerini korurken kitaplığı içe aktarmasını sağlamak için <uses-sdk> etiketine overrideLibrary özelliğini ekleyin. Öznitelik değeri, ana manifest'in minSdk değerini geçersiz kılabilecek kitaplıkları belirten bir veya daha fazla kitaplık paketi adı (virgülle ayrılmış) olabilir.

Örneğin, uygulamanızın ana manifestinde overrideLibrary aşağıdaki gibi bir uygulama geçerliyse:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.app"
          xmlns:tools="http://schemas.android.com/tools">
  <uses-sdk tools:overrideLibrary="com.example.lib1, com.example.lib2"/>
...

Ardından aşağıdaki manifest, <uses-sdk> etiketiyle ilgili bir hata olmadan birleştirilebilir ve birleştirilen manifest, uygulama manifestindeki minSdk="2" öğesini korur.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.lib1">
   <uses-sdk android:minSdk="4" />
...

Örtük sistem izinleri

Bir zamanlar uygulamalar tarafından özgürce erişilebilen bazı Android API'leri, Android'in son sürümlerinde sistem izinleriyle kısıtlandı.

Bu API'lere erişmeyi bekleyen uygulamaların çalışmasını engellememek için Android'in son sürümlerinde, targetSdkVersion kısıtlamanın eklendiği sürümden daha düşük bir değere ayarlanırsa uygulamaların bu API'lere izin olmadan erişmeye devam etmesine izin verilir. Bu davranış, uygulamaya API'lere erişim izni verir. targetSdkVersion için farklı değerlere sahip birleştirilmiş manifestler etkilenebilir.

Daha düşük öncelikli manifest dosyasında, targetSdkVersion için daha düşük bir değer varsa ve bu değer ona dolaylı izin sağlıyorsa ve daha yüksek öncelikli manifest'te aynı dolaylı izin yoksa (targetSdkVersion değeri, kısıtlamanın eklendiği sürüme eşit veya bu sürümden yüksek olduğu için) birleştirme aracı, sistem iznini birleştirilmiş manifest'e açıkça ekler.

Örneğin, uygulamanız targetSdkVersion değerini 4 veya daha yüksek bir değere ayarlar ve targetSdkVersion değeri 3 veya daha düşük olan bir kitaplığı içe aktarırsa birleştirme aracı, WRITE_EXTERNAL_STORAGE iznini birleştirilmiş manifest dosyasına ekler.

Tablo 2'de, birleştirilmiş manifestinize eklenebilecek tüm olası izinler listelenmektedir:

Tablo 2. Birleştirici aracının birleştirilmiş manifest'e ekleyebileceği izinlerin listesi

Düşük öncelikli manifest beyanları Birleştirilmiş manifest'e eklenen izinler
targetSdkVersion 3 veya daha düşük WRITE_EXTERNAL_STORAGE, READ_PHONE_STATE
targetSdkVersion 15 yaşında veya daha küçük ve READ_CONTACTS kullanıyor READ_CALL_LOG
targetSdkVersion 15 yaşında veya daha küçük ve WRITE_CONTACTS kullanıyor WRITE_CALL_LOG

Birleştirilmiş manifest dosyasını inceleme ve çakışmaları bulma

Uygulamanızı oluşturmadan önce bile birleştirilmiş manifest'inizin önizlemesini görebilirsiniz. Önizlemeyi görmek için aşağıdakileri yapın:

  1. Android Studio'da AndroidManifest.xml dosyanızı açın.
  2. Düzenleyicinin alt kısmındaki Birleştirilmiş Manifest sekmesini tıklayın.

Birleştirilmiş Manifest görünümünde, birleştirilmiş manifest'in sonuçları solda, birleştirilmiş her manifest dosyasıyla ilgili bilgiler ise sağda gösterilir (Şekil 2).

Daha düşük öncelikli manifest dosyalarından birleştirilen öğeler solda farklı renklerle vurgulanır. Her rengin anahtarı Manifest Kaynakları bölümünde belirtilir.

Şekil 2. Birleştirilmiş manifest görünümü.

Derlemenin parçası olan ancak öğe veya özellik katkısında bulunmayan manifest dosyaları Diğer Manifest Dosyaları altında listelenir.

Bir öğenin nereden geldiğiyle ilgili bilgileri görmek için sol bölmede öğeyi tıklayın. Ayrıntılar Birleştirme Günlüğü altında görünür.

Çakışmalar varsa Birleştirme Hataları bölümünde gösterilir ve birleştirme kuralı işaretçileri kullanılarak nasıl çözüleceğine dair bir öneri sunulur.

Hatalar Etkinlik Günlüğü penceresine de yazdırılır. Bunları görüntülemek için Görünüm > Araç Pencereleri > Etkinlik Günlüğü'nü seçin.

Birleştirme karar ağacının tam günlüğünü görmek için günlük dosyasını modülünüzün build/outputs/logs/ dizininde manifest-merger-buildVariant-report.txt adlı dosyada bulabilirsiniz.

Politikaları birleştirme

Manifest birleştirme aracı, bir manifest dosyasındaki her XML öğesini mantıksal olarak başka bir dosyadaki ilgili öğeyle eşleştirebilir. Birleştirici, her öğeyi eşleme anahtarı (benzersiz bir özellik değeri (android:name gibi) veya etiketin doğal benzersizliği (örneğin, yalnızca bir <supports-screen> öğesi olabilir)) kullanarak eşleştirir.

İki manifest'te aynı XML öğesi varsa araç, üç birleştirme politikasından birini kullanarak iki öğeyi birleştirir:

Birleştir
Çakışmayan tüm özellikleri aynı etikette birleştirin ve alt öğeleri kendi birleştirme politikalarına göre birleştirin. Birbiriyle çelişen özellikler varsa bunları birleştirme kuralı işaretçileri ile birleştirin.
Yalnızca alt öğeleri birleştir
Özellikleri birleştirmeyin veya birleştirmeyin (yalnızca en yüksek öncelikli manifest dosyasında sağlanan özellikleri koruyun) ve alt öğeleri birleştirme politikalarına göre birleştirin.
Keep
Öğeyi olduğu gibi bırakın ve birleştirilen dosyadaki ortak üst öğeye ekleyin. Bu, yalnızca aynı öğenin birkaç kez tanımlanmasının kabul edilebilir olduğu durumlarda kullanılır.

Tablo 3'te her öğe türü, kullanılan birleştirme politikasının türü ve iki manifest arasındaki öğe eşleşmesini belirlemek için kullanılan anahtar listelenir:

Tablo 3. Manifest öğesi birleştirme politikaları ve eşleşme anahtarları

Element Birleştirme politikası Eşleme anahtarı
<action> Birleştir android:name özelliği
<activity> Birleştir android:name özelliği
<application> Birleştir <manifest> başına yalnızca bir tane vardır.
<category> Birleştir android:name özelliği
<data> Birleştir <intent-filter> başına yalnızca bir tane vardır.
<grant-uri-permission> Birleştir <provider> başına yalnızca bir tane vardır.
<instrumentation> Birleştir android:name özelliği
<intent-filter> Keep Eşleşme yok; üst öğe içinde birden fazla bildirime izin verilir.
<manifest> Yalnızca alt öğeleri birleştir Dosya başına yalnızca bir tane vardır.
<meta-data> Birleştir android:name özelliği
<path-permission> Birleştir <provider> başına yalnızca bir tane vardır.
<permission-group> Birleştir android:name özelliği
<permission> Birleştir android:name özelliği
<permission-tree> Birleştir android:name özelliği
<provider> Birleştir android:name özelliği
<receiver> Birleştir android:name özelliği
<screen> Birleştir android:screenSize özelliği
<service> Birleştir android:name özelliği
<supports-gl-texture> Birleştir android:name özelliği
<supports-screen> Birleştir <manifest> başına yalnızca bir tane vardır.
<uses-configuration> Birleştir <manifest> başına yalnızca bir tane vardır.
<uses-feature> Birleştir android:name özelliği (mevcutsa android:glEsVersion özelliği)
<uses-library> Birleştir android:name özelliği
<uses-permission> Birleştir android:name özelliği
<uses-sdk> Birleştir <manifest> başına yalnızca bir tane vardır.
Özel öğeler Birleştir Eşleşme yok; bunlar birleştirme aracı tarafından bilinmez ve her zaman birleştirilmiş manifest'e dahil edilir.

Derleme değişkenlerini manifest dosyasına girme

AndroidManifest.xml dosyanıza build.gradle dosyanızda tanımlanmış değişkenler eklemeniz gerekiyorsa bunu manifestPlaceholders mülküyle yapabilirsiniz. Bu özellik, aşağıda gösterildiği gibi anahtar/değer çiftlerinin bir haritasını alır:

Groovy

android {
    defaultConfig {
        manifestPlaceholders = [hostName:"www.example.com"]
    }
    ...
}

Kotlin

android {
    defaultConfig {
        manifestPlaceholders["hostName"] = "www.example.com"
    }
    ...
}

Ardından, yer tutuculardan birini manifest dosyasına özellik değeri olarak ekleyebilirsiniz:

<intent-filter ... >
    <data android:scheme="https" android:host="${hostName}" ... />
    ...
</intent-filter>

Derleme araçları varsayılan olarak ${applicationId} yer tutucusunda uygulamanızın uygulama kimliğini de sağlar. Değer, derleme varyantlarına göre yapılan değişiklikler dahil olmak üzere her zaman geçerli derlemenin nihai uygulama kimliğiyle eşleşir. Bu, derleme varyantlarınız arasında bile intent işlemi gibi tanımlayıcılar için benzersiz bir ad alanı kullanmak istediğinizde yararlıdır.

Örneğin, build.gradle dosyanız şu şekilde görünüyorsa:

Groovy

android {
    defaultConfig {
        applicationId "com.example.myapp"
    }
    flavorDimensions "type"
    productFlavors {
        free {
            applicationIdSuffix ".free"
            dimension "type"
        }
        pro {
            applicationIdSuffix ".pro"
            dimension "type"
        }
    }
}

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"
    }
    flavorDimensions += "type"
    productFlavors {
        create("free") {
            applicationIdSuffix = ".free"
            dimension = "type"
        }
        create("pro") {
            applicationIdSuffix = ".pro"
            dimension = "type"
        }
    }
}

Ardından uygulama kimliğini manifest dosyanıza şu şekilde ekleyebilirsiniz:

<intent-filter ... >
    <action android:name="${applicationId}.TRANSMOGRIFY" />
    ...
</intent-filter>

"Ücretsiz" ürün çeşidini oluşturduğunuzda manifest sonucu şu şekilde olur:

<intent-filter ... >
   <action android:name="com.example.myapp.free.TRANSMOGRIFY" />
    ...
</intent-filter>

Daha fazla bilgi için Uygulama kimliğini ayarlama başlıklı makaleyi inceleyin.