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ına giriş için uygulama manifestine 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 değişkenleri ve içe aktarılan kitaplıklar tarafından sağlanan birkaç manifest dosyası içerebilir. Uygulamanızı oluştururken Gradle derlemesi, tüm manifest dosyalarını uygulamanızda paketlenen tek bir manifest dosyasında birleştirir.

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

Öncelikleri birleştirme

Birleştirme aracı, her bir 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, bir sonraki en yüksek öncelikli manifest ile birleştirilir ve ardından bu, Şekil 1'de gösterildiği gibi en yüksek öncelikli manifest ile birleştirilir.

Şekil 1. Üç manifest dosyasını birleştirme işlemi. En düşük öncelikli dosya, en yüksek öncelikli dosyayla birleştirilir.

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

  1. Derleme değişkeniniz için manifest dosyası

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

    • Derleme değişkeni manifesti (ör. src/demoDebug/)
    • Derleme türü manifesti (ör. src/debug/)
    • Ürün türü manifesti (ör. src/demo/)

      Tür boyutları kullanıyorsanız manifest öncelikleri, her boyutun flavorDimensions özelliğinde listelendiği sıraya karşılık gelir (ilk boyut en yüksek önceliğe sahiptir).

  2. Uygulama modülünün ana manifest dosyası

  3. Dahil edilen bir kitaplıktan manifest dosyası

    Birden fazla kitaplığınız varsa bunları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 değişkeni manifestiyle birleştirilir. Bunların, Kaynak gruplarıyla derleme bölümünde açıklandığı gibi tüm kaynak grupları için aynı birleştirme öncelikleri olduğunu unutmayın.

Çakışma buluşsal yöntemlerini birleştirme

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 bölümüne bakın.

Düşük öncelikli manifestteki bir öğe, yüksek öncelikli manifestteki hiçbir öğeyle eşleşmiyorsa birleştirilmiş manifest dosyasına 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 manifest dosyasında da aynı özelliğin farklı değerlerle yer aldığını tespit ederse birleştirme çakışması meydana gelir.

Tablo 1'de, birleştirme aracı tüm özellikleri aynı öğede birleştirmeye çalıştığında 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ğer yok Değer yok Değer yok (varsayılan değeri kullan)
B değeri B değeri
A Değeri Değer yok 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 aracı, birleştirme çakışmalarını önlemek için birkaç durumda farklı davranır:

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

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

Kural işaretçilerini birleştirme

Birleştirme kuralı işaretçisi, birleştirme çakışmalarının nasıl çözüleceği veya istenmeyen öğelerin ve özelliklerin nasıl kaldırılacağıyla ilgili tercihinizi belirtmek için kullanabileceğiniz bir XML özelliğidir. İşaretleyiciyi bir öğenin tamamına veya yalnızca belirli özelliklerine uygulayabilirsiniz.

Birleştirme aracı, iki manifest dosyasını birleştirirken daha yüksek öncelikli manifest dosyasında bu işaretleri arar.

Tüm işaretçiler Android tools ad alanına aittir. Bu nedenle, öncelikle bu ad alanını <manifest> öğesinde burada gösterildiği gibi 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

Bir birleştirme kuralını 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ı sezgisel analizini kullanarak çakışma olmadığında bu etiketteki tüm özellikleri ve tüm iç içe yerleştirilmiş öğeleri 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="mergeOnlyAttributes"
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="mergeOnlyAttributes">
</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, kontrolünüz dışında olan daha düşük öncelikli bir manifest dosyası (ör. içe aktarılan bir kitaplık) tarafından sağlanan ve ihtiyacınız olmayan 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" ile benzerdir 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, daha düşük öncelikli manifestte eşleşen bir öğe varsa bu öğeyi yoksay ve bu öğeyi tam olarak bu manifestte göründüğü gibi kullan.

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 dosyasındaki bu öğe, yüksek öncelikli manifest dosyasındaki öğeyle tam eşleşme sağlamadığında (diğer birleştirme kuralı işaretçileri tarafından çözülmediği sürece) derleme hatası oluşturun. Bu, birleştirme çakışması sezgisel yöntemlerini geçersiz kılar. Örneğin, daha düşük öncelikli manifestte fazladan bir özellik varsa derleme başarısız olur (varsayılan davranış ise fazladan özelliği birleştirilmiş manifest dosyasına 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, yüksek düzey modunda hiçbir şekilde farklı olamaz. Bu farklılıkları çözmek için diğer birleştirme kuralı işaretçilerini uygulamanız gerekir. (tools:node="strict" olmadan bu iki dosya, tools:node="merge" örneğinde gösterildiği gibi hatasız bir şekilde birleştirilebilir.)

Özellik işaretçileri

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

tools:remove="attr, ..."
Belirtilen özellikleri birleştirilmiş manifest dosyasından kaldırın. Daha düşük öncelikli manifest dosyası bu özellikleri içerdiğinde ve bunların birleştirilmiş manifest dosyasına 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 dosyasında belirtilen özellikleri bu manifest dosyasındakilerle değiştirin. Başka bir deyişle, her zaman daha yüksek öncelikli manifest dosyasının 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 dosyasındaki bu özellikler, yüksek öncelikli manifest dosyasındaki özelliklerle tam olarak eşleşmediğinde derleme hatası oluşturun. Bu, birleştirme çakışması sezgisel analizinde açıklandığı gibi özel davranışları 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çileri uygulamanız gerekir. Bu, varsayılan davranıştır. Bu nedenle, tools:strict="screenOrientation" açıkça eklendiğinde de aynı sonuç elde edilir.

Ayrıca, aşağıdaki örnekte gösterildiği gibi bir öğeye birden fazla işaretçi 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 kitaplık paketi adıyla tools:selector özelliğini ekleyin.

Örneğin, aşağıdaki manifest dosyasında remove birleştirme kuralı yalnızca daha düşük öncelikli manifest dosyası com.example.lib1 kitaplığından geldiğinde uygulanır:

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

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

İç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 oluşur 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 koruyarak kitaplığı içe aktarmasını sağlamak için <uses-sdk> etiketine overrideLibrary özelliğini ekleyin. Özellik değeri, ana manifest dosyasının 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 manifest dosyası 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, uygulama manifestindeki minSdk="2" değerini korur.

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

Dolaylı sistem izinleri

Bir zamanlar uygulamalar tarafından serbestçe erişilebilen bazı Android API'leri, Android'in son sürümlerinde sistem izinleri ile kısıtlanmıştır.

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

Daha 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 dosyasında aynı örtülü izin yoksa (targetSdkVersion değeri, kısıtlamanın eklendiği sürüme eşit veya ondan daha yüksek olduğu için) birleştirme aracı, sistem iznini birleştirilmiş manifest dosyasına açıkça ekler.

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

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

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

Daha düşük öncelikli manifest bildirimleri Birleştirilmiş manifest dosyasına eklenen izinler
targetSdkVersion 3 veya daha düşük WRITE_EXTERNAL_STORAGE, READ_PHONE_STATE
targetSdkVersion 15 veya daha düşük ve READ_CONTACTS kullanıyor READ_CALL_LOG
targetSdkVersion 15 veya daha düşük ve WRITE_CONTACTS kullanıyor WRITE_CALL_LOG

Birleştirilmiş manifesti inceleme ve çakışmaları bulma

Uygulamanızı oluşturmadan önce bile birleştirilmiş manifestinizin nasıl göründüğünün önizlemesini görebilirsiniz. Önizleme 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 Merged Manifest (Birleştirilmiş Manifest) sekmesini tıklayın.

Birleştirilmiş Manifest görünümü, Şekil 2'de gösterildiği gibi, birleştirilmiş manifestin sonuçlarını solda ve her bir birleştirilmiş manifest dosyasıyla ilgili bilgileri sağda gösterir.

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.

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

Derlemenin parçası olan ancak öğe veya özellik eklemeyen manifest dosyaları Diğer Manifest Dosyaları bölümünde 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.

Herhangi bir çakışma olursa bunlar Birleştirme Hataları altında, birleştirme kuralı işaretçilerini kullanarak çakışmanın nasıl çözüleceğine dair bir öneriyle birlikte görünür.

Hatalar, Olay Günlüğü penceresinde de gösterilir. Bunları görüntülemek için View > Tool Windows > Event Log'u (Görünüm > Araç Pencereleri > Olay Günlüğü) seçin.

Birleştirme karar ağacının tam günlüğünü görmek için modülünüzün build/outputs/logs/ dizininde manifest-merger-buildVariant-report.txt adlı günlük dosyasını 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ştirici, her öğeyi benzersiz bir özellik değeri (ör. android:name) veya etiketin kendi doğal benzersizliği (ör. yalnızca bir <supports-screen> öğesi olabilir) gibi bir eşleşme anahtarı kullanarak eşleştirir.

İki manifestte 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. Özellikler arasında çakışma varsa birleştirme kuralı işaretçileri ile bunları birleştirin.
Yalnızca alt öğeleri birleştir
Özellikleri birleştirmeyin (yalnızca en yüksek öncelikli manifest dosyasının sağladığı özellikleri kullanın) ve alt öğeleri, birleştirme politikalarına göre birleştirin.
Koru
Öğeyi olduğu gibi bırakın ve birleştirilmiş dosyadaki ortak üst öğeye ekleyin. Bu, yalnızca aynı öğenin birden fazla beyanının kabul edilebilir olduğu durumlarda kullanılır.

Tablo 3'te her öğe türü, kullanılan birleştirme politikası 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ı

Öğe Birleştirme politikası Eşleşme 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> Koru Eşleşme yok; üst öğe içinde birden fazla beyana izin verilir.
<manifest> Yalnızca alt öğeleri birleştir Dosya başına yalnızca bir tane bulunur.
<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 (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 <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

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

Modern

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 uygulamanızın uygulama kimliğini de ${applicationId} yer tutucusunda sağlar. Değer, derleme değişkenlerine göre yapılan değişiklikler de dahil olmak üzere her zaman mevcut 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 faydalıdır.

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

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 türünü 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 okuyun.