Manifest dosyalarını yönetme

Bu sayfada, manifest birleştirmenin işleyiş şekli ve birleştirme çakışmalarını çözmek için birleştirme tercihlerini nasıl uygulayabileceğiniz açıklanmaktadır. Uygulama manifest dosyası hakkında daha fazla bilgi için uygulama manifesti dosyasına genel bakış bölümüne bakın.

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ızla paketlenmiş tek bir manifest dosyasında birleştirir.

Manifest birleştirme aracı, birleştirme buluşsal yöntemleri izleyerek ve özel XML özellikleriyle tanımladığınız birleştirme tercihlerine uyarak her bir 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ştir

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

Şekil 1. En düşük öncelikli ve en yüksek öncelikli olacak şekilde üç manifest dosyasının birleştirilmesiyle ilgili süreç.

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

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

    Varyantınız için birden fazla kaynak grubunuz varsa manifest öncelikleri aşağıdaki gibi olur:

    • Varyant manifestini oluşturun (ör. src/demoDebug/)
    • Derleme türü manifesti (ör. src/debug/)
    • Ürün lezzet manifesti (ör. src/demo/)

      Aroma boyutlarını kullanıyorsanız manifest öncelikleri, her boyutun flavorDimensions özelliğinde listelendiği sıraya karşılık gelir (birinci en yüksek önceliktir).

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

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

Örneğin, bir kitaplık manifesti ana manifest ile, ardından ana manifest de derleme varyantı manifestiyle birleştirilir. Bunların, Kaynak gruplarıyla 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 oluşturulan derleme yapılandırmaları, birleştirilmiş manifest dosyasında karşılık gelen tüm özellikleri geçersiz kılar. Örneğin, build.gradle veya build.gradle.kts dosyasındaki minSdk, <uses-sdk> manifest öğesindeki eşleşen özelliği geçersiz kılar. Karışıklığı önlemek için <uses-sdk> öğesini hariç tutun ve bu özellikleri yalnızca build.gradle dosyasında tanımlayın. Daha fazla bilgi için Derlemenizi yapılandırma bölümüne bakın.

Birleştirme buluşsal yöntemleri

Birleştirme aracı, bir manifestteki her XML öğesini, başka bir manifestteki karşılık gelen öğeyle mantıksal olarak eşleştirebilir. Eşleştirmenin işleyiş şekliyle ilgili ayrıntılar için önceki bölümde yer alan birleştirme öncelikleri konusuna bakın.

Düşük öncelikli manifestteki bir öğe, daha yüksek öncelikli manifestteki hiçbir öğeyle eşleşmezse bu öğe, birleştirilmiş manifeste eklenir. Ancak eşleşen bir öğe varsa birleştirme aracı, her birindeki tüm özellikleri aynı öğede birleştirmeye çalışır. Araç her iki manifestin de farklı değerlerle aynı özelliği içerdiğini tespit ederse birleştirme çakışması olur.

Tablo 1'de, birleştirme aracının tüm özellikleri aynı öğede birleştirmeye çalışması durumunda ortaya çıkabilecek sonuçlar gösterilmektedir.

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ğeri kullanın)
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ı: Bir 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 OR birleştirmesi kullanır. Bir çakışma varsa "true" uygulanır ve bir manifestin gerektirdiği özellik veya kitaplık her zaman dahil edilir.
  • <uses-sdk> öğesindeki özellikler, aşağıdaki durumlar haricinde her zaman yüksek öncelikli manifestteki değeri kullanır:
    • Düşük öncelikli manifestte daha yüksek bir minSdk değeri olduğunda, overrideLibrary birleştirme kuralını uygulamazsanız bir hata oluşur.
    • Düşük öncelikli manifest daha düşük bir targetSdkVersion değerine sahip olduğunda birleştirme aracı, yüksek öncelikli manifestteki değeri kullanır ve içe aktarılan kitaplığın düzgün çalışmaya devam etmesini sağlamak için gerekli olan sistem izinlerini de ekler (yüksek Android sürümünde izin kısıtlamalarının artırıldığı durumlarda). Bu davranış hakkında daha fazla bilgi için örtük sistem izinleri hakkındaki bölüme bakın.
  • <intent-filter> öğesi hiçbir zaman manifestler arasında eşleştirilmez. Her biri benzersiz olarak değerlendirilir ve birleştirilmiş manifestte ortak üst öğeye eklenir.

Özellikler arasındaki diğer tüm çakışmalar için hata alırsınız ve daha yüksek öncelikli manifest dosyasına özel bir özellik ekleyerek birleştirme aracına bu sorunun nasıl çözüleceğini açıklamanız gerekir. Birleştirme kuralı işaretçileri ile ilgili aşağıdaki bölüme bakın.

Varsayılan özellik değerlerine bağlı kalmayın. Tüm benzersiz özellikler aynı öğede birleştirildiğinden, daha yüksek öncelikli manifest aslında bir özelliğin belirtilmeden varsayılan değerine bağlıysa bu durum, beklenmeyen sonuçlara yol açabilir. Örneğin, yüksek öncelikli manifest android:launchMode özelliğini bildirmezse varsayılan "standard" değerini kullanır. Ancak düşük öncelikli manifestte bu özelliği farklı bir değerle tanımlarsa bu değer, varsayılan değeri geçersiz kılan birleştirilmiş manifeste uygulanır. Her bir özelliği, olmasını istediğiniz şekilde açık bir şekilde tanımlamanız gerekir. Her özelliğin varsayılan değerleri manifest referansında belgelenmiştir.

Kural işaretçilerini birleştirme

Birleştirme kuralı işaretçisi, birleştirme çakışmalarını çözme veya istenmeyen öğe ve özellikleri kaldırma ile ilgili tercihinizi ifade etmek için kullanabileceğiniz bir XML özelliğidir. İşaretçiyi bir öğenin tamamına veya bir öğedeki yalnızca belirli özelliklere uygulayabilirsiniz.

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

Tüm işaretçiler Android tools ad alanına ait olduğundan, önce burada gösterildiği gibi <manifest> öğesinde bu ad alanını bildirmeniz 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

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

tools:node="merge"
Birleştirme çakışması bulgularını kullanarak, çakışma yoksa bu etiketteki ve iç içe yerleştirilmiş tüm öğeleri birleştirin. Öğeler için varsayılan davranış budur.

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ştir. İç 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ş manifestten kaldırın. Birleştirilmiş manifestinizde, kontrolünüz dışında olan daha düşük öncelikli bir manifest dosyası (ör. içe aktarılan kitaplık) tarafından sağlanması gerekmeyen bir öğeyi 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" işlevine benzerdir ancak bu öğe türüyle eşleşen tüm öğeleri kaldırır (aynı üst öğe içinde).

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"
Düşük öncelikli öğeyi tamamen değiştirin. Yani düşük öncelikli manifestte eşleşen bir öğe varsa bunu göz ardı edin ve bu öğeyi tam olarak bu manifest'te 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 manifestteki bu öğe, daha yüksek öncelikli manifestteki öğeyle tam olarak eşleşmediğinde (diğer birleştirme kuralı işaretçileri tarafından çözülmediği sürece) bir derleme hatası oluşturun. Bu durum, birleştirme çakışması buluşsal yöntemlerini geçersiz kılar. Örneğin, düşük öncelikli manifestte ekstra bir özellik varsa derleme başarısız olur (ancak varsayılan davranış, birleştirilmiş manifeste ekstra özelliği 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 işlem, manifest birleştirme hatası oluşturur. Katı modda iki manifest öğesi hiç fark edemez. Bu farklılıkları gidermek için diğer birleştirme kuralı işaretçilerini uygulamanız gerekir. (tools:node="merge" örneğinde gösterildiği gibi, tools:node="strict" kullanılmadığında bu iki dosya hatasız bir şekilde birleştirilebilir.)

Özellik işaretçileri

Bunun yerine, 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ş manifestten kaldırın. Daha düşük öncelikli manifest dosyası bu özellikleri içerdiğinde ve bunların birleştirilmiş manifeste gitmediğ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, ..."
Düşük öncelikli manifestte belirtilen özellikleri, bu manifesttekilerle 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 manifestteki bu özellikler, daha yüksek öncelikli manifestteki özelliklerle tam olarak eşleşmediğinde derleme hatası oluşturun. Bu, birleştirme çakışması bulgularında açıklandığı gibi özel davranışa 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 işlem, manifest birleştirme hatası oluşturur. Çakışmayı çözmek için diğer birleştirme kuralı işaretçilerini uygulamanız gerekir. Bu, varsayılan davranıştır. Bu nedenle, tools:strict="screenOrientation" açıkça eklendiğinde de aynı sonuç ortaya çıkar.

Aşağıdaki örnekte gösterildiği gibi, bir öğeye birden çok 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 içe aktarılan belirli bir kitaplığa uygulamak isterseniz kitaplık paketi adıyla birlikte tools:selector özelliğini ekleyin.

Örneğin, aşağıdaki manifestte remove birleş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">

Daha düşük öncelikli manifest başka herhangi bir kaynaktan geliyorsa remove birleştirme kuralı yok sayılır.

Not: Bunu ö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ıl

Varsayılan olarak, minSdk değeri ana manifest dosyasından daha yüksek olan bir kitaplığı içe aktarırken hata oluşur ve kitaplık içe aktarılamaz.

Birleştirme aracının bu çakışmayı yoksayıp kitaplığı içe aktarmasını sağlamak için uygulamanızın alt minSdk değerini koruyun ve <uses-sdk> etiketine overrideLibrary özelliğini ekleyin. Özellik değeri, ana manifestin minSdk öğesini geçersiz kılabilecek kitaplıkları gösteren bir veya daha fazla kitaplık paketi adı (virgülle ayrılmış) olabilir.

Örneğin, uygulamanızın ana manifesti overrideLibrary öğesini şu şekilde uyguluyorsa:

<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ştirilmiş manifest, minSdk="2" dosyasını uygulama manifestinden tutar.

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

Örtük sistem izinleri

Önceden uygulamalar tarafından ücretsiz olarak erişilebilen bazı Android API'leri, Android'in son sürümlerinde sistem izinleri tarafından kısıtlanmıştır.

Android'in son sürümleri, bu API'lere erişimi bekleyen uygulamaların bozulmasını önlemek amacıyla, targetSdkVersion kısıtlamasının eklendiği sürümden daha düşük bir değere ayarlanırsa uygulamaların izin olmadan bu API'lere erişmeye devam etmesine izin verir. Bu davranış, uygulamaya API'lere erişim izni vermek için dolaylı bir izin verir. targetSdkVersion için farklı değerlere sahip birleştirilmiş manifestler etkilenebilir.

Düşük öncelikli manifest dosyasında örtülü izin sağlayan daha düşük bir targetSdkVersion değeri varsa ve daha yüksek öncelikli manifest aynı örtülü izne sahip değilse (targetSdkVersion dosyası kısıtlamanın eklendiği sürüme eşit veya bundan daha yüksek olduğu için) birleştirme aracı, sistem iznini birleştirilmiş manifeste açıkça ekler.

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

Tablo 2'de, birleştirilmiş manifest'inize eklenebilecek tüm izinler listelenmiştir:

Tablo 2. Birleştirme aracının birleştirilmiş manifeste ekleyebilecekleri izinlerin listesi.

Düşük öncelikli manifest beyanları Birleştirilmiş manifeste izinler eklendi
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ş manifesti inceleyin ve çakışmaları bulun

Uygulamanızı oluşturmadan önce bile, birleştirilmiş manifestinizin nasıl göründüğüne ilişkin bir önizleme görebilirsiniz. Önizlemeyi görmek için şunları 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ü, Şekil 2'de gösterildiği gibi solda birleştirilmiş manifestin sonuçlarını, sağda ise birleştirilmiş her manifest dosyasıyla ilgili bilgileri gösterir.

Düşük öncelikli manifest dosyalarından birleştirilen öğeler, solda farklı renklerle vurgulanır. Her bir rengin anahtarı Manifest Kaynakları altında belirtilir.

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

Derlemenin parçası olan ancak öğe veya özelliklerle katkıda 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österilir.

Herhangi bir çakışma olursa Birleştirme Hataları bölümünde, birleştirme kuralı işaretçilerini kullanarak çakışmanın nasıl giderileceğine dair bir öneriyle birlikte gösterilir.

Hatalar Olay Günlüğü penceresine de yazdırılır. Bunları görüntülemek için Görünüm > Araç Pencereleri > Olay 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 manifest-merger-buildVariant-report.txt adlı build/outputs/logs/ dizininde bulabilirsiniz.

Politikaları birleştirme

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

İki manifest aynı XML öğesine sahipse araç, şu üç birleştirme politikasından birini kullanarak iki öğeyi birleştirir:

Birleştir
Çakışmayan tüm özellikleri aynı etikette birleştirin ve alt öğeleri ilgili birleştirme politikalarına göre birleştirin. Herhangi bir özellik birbiriyle çakışırsa bunları birleştirme kuralı işaretçileriyle birleştirin.
Yalnızca alt çocukları birleştir
Özellikleri (yalnızca en yüksek öncelikli manifest dosyasında sağlanan özellikleri tutun) ve alt öğeleri kendi birleştirme politikalarına uygun şekilde birleştirmeyin.
Koru
Öğeyi olduğu gibi bırakıp, birleştirilmiş dosyadaki ortak üst öğeye ekleyin. Bu, yalnızca aynı öğenin birkaç beyanının bulunması kabul edilebilir olduğunda 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 listelenmiştir:

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

Element Birleştirme politikası Eşleşme anahtarı
<action> Birleştir android:name özelliği
<activity> Birleştir android:name özelliği
<application> Birleştir Her <manifest> için yalnızca bir promosyon kodu vardır.
<category> Birleştir android:name özelliği
<data> Birleştir Her <intent-filter> için yalnızca bir promosyon kodu vardır.
<grant-uri-permission> Birleştir Her <provider> için yalnızca bir promosyon kodu vardır.
<instrumentation> Birleştir android:name özelliği
<intent-filter> Koru Eşleşme yok; üst öğe içinde birkaç bildirime izin verilir.
<manifest> Yalnızca alt çocukları birleştir Her dosya için yalnızca bir tane vardır.
<meta-data> Birleştir android:name özelliği
<path-permission> Birleştir Her <provider> için yalnızca bir promosyon kodu 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 Her <manifest> için yalnızca bir promosyon kodu vardır.
<uses-configuration> Birleştir Her <manifest> için yalnızca bir promosyon kodu vardır.
<uses-feature> Birleştir android:name özelliği (mevcut değilse android:glEsVersion özelliği)
<uses-library> Birleştir android:name özelliği
<uses-permission> Birleştir android:name özelliği
<uses-sdk> Birleştir Her <manifest> için yalnızca bir promosyon kodu vardır.
Özel öğeler Birleştir Eşleşme yok. Bunlar, birleştirme aracı tarafından bilinmiyor ve her zaman birleştirilen manifeste dahil edilir.

Derleme değişkenlerini manifest dosyasına girme

AndroidManifest.xml dosyanıza, build.gradle dosyanızda tanımlanan değişkenler eklemeniz gerekirse manifestPlaceholders özelliğiyle yapabilirsiniz. Bu özellik, burada gösterildiği gibi anahtar/değer çiftlerinin bir eşlemesini alır:

Modern

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

Kotlin

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

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

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

Varsayılan olarak derleme araçları, ${applicationId} yer tutucusunda uygulamanızın uygulama kimliğini de sağlar. Değer, derleme varyantlarının değişiklikleri de dahil olmak üzere her zaman mevcut derlemenin son 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ı olur.

Örneğin, build.gradle dosyanız şunun gibiyse:

Modern

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şitlerini oluşturduğunuzda ortaya çıkan sonuç şudur:

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

Daha fazla bilgi için Uygulama kimliğini ayarlama bölümünü inceleyin.