Manifest dosyalarını yönetme

Bu sayfada manifest birleştirmenin işleyiş şekli ve birleştirme işlemini nasıl uygulayabileceğiniz açıklanmaktadır. tercihlerini birleştirme çakışmalarını çözme. Uygulamaya giriş için daha fazla bilgi için uygulama manifestine genel bakış.

Birden fazla manifest dosyasını birleştirme

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

Manifest birleştirme aracı, aşağıdaki adımları uygulayarak her bir dosyadaki tüm XML öğelerini birleştirir: tanımladığınız birleştirme tercihlerine uyma ve buluşsal yöntemleri birleştirme özellikleri kullanır.

İpucu: Birleştirilmiş Manifest'i kullanın. görünümünü incelemenizi öneririz. hatalar.

Öncelikleri birleştir

Birleştirme aracı, tüm manifest dosyalarını tek bir dosyada birleştirir öncelik sırasına göre sırayla güncelleyin. Örneğin yeni web sitesi üç manifest dosyası varsa, en düşük öncelikli manifest; sonraki en yüksek öncelikli manifeste gönderilir ve bu rapor, en yüksek öncelikli manifest'ini kullanabilirsiniz.

Şekil 1. Üç manifesti birleştirme işlemi dosyaları, en düşük öncelikli en yüksek önceliğe.

Her bir manifest dosyasıyla birleştirilebilecek üç temel manifest dosyası türü vardır diğer öncelikleri ve birleştirme öncelikleri aşağıdaki gibidir (önce en yüksek öncelikli):

  1. için manifest dosyası olarak derleme varyantı

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

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

      Aroma boyutları kullanıyorsanız manifest önceliklerinin her boyutun tablodaki sıralamaya flavorDimensions mülkü (birinci en yüksek önceliğe sahiptir).

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

    Birden fazla kitaplığınız varsa manifest öncelikleri eşleşir göründükleri sıraya sokmaktır. dependencies blok.

Örneğin, bir kitaplık manifesti ana manifestte birleştirilir, ardından ana manifesto manifest dosyası, derleme varyantı manifestinde birleştirilir. Bunların aynı açıklandığı gibi, tüm kaynak kümeleri için öncelikleri birleştirme Kaynak kümeleriyle derleyin.

Önemli: build.gradle dosyası, birleştirilmiş manifest dosyası olabilir. Örneğin, build.gradle satıcısından minSdk veya build.gradle.kts dosyası, <uses-sdk> manifest öğesi. Karışıklık olmaması için <uses-sdk> öğesi seçin ve bu özellikleri yalnızca build.gradle dosya Daha fazla bilgi için bkz. Derlemenizi yapılandırın.

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

Birleştirme aracı, bir manifestteki her XML öğesini mantıksal olarak başka bir manifest'te karşılık gelen öğe oluşturabilirsiniz. Eşleştirme hakkında ayrıntılı bilgi için nasıl çalışırsa sonraki bölümde yer alan birleştirme önceliklerine bakın.

Düşük öncelikli manifestteki bir öğe, daha yüksek öncelikli manifeste eklenir ve daha sonra, birleştirilmiş manifeste eklenir. Ancak, eşleşen bir öğe varsa birleştirme aracı, belirli bir öğeyi her birindeki tüm özellikleri aynı öğeye taşır. Araç, hem manifest'ler, farklı değerlerle aynı özelliği, ardından bir birleştirme ve çakışma meydana gelir.

Tablo 1'de, birleşme aracının birleştirmeye çalıştığı durumlarda ortaya çıkabilecek aynı öğede toplar.

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

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)
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çisine ihtiyacınız olacaktır.

Ancak, birleştirme aracının farklı davrandığı birkaç durum vardır. için şu adımları izleyin:

  • <manifest> öğesindeki özellikler hiçbir zaman birleştirilmez birlikte; yalnızca en yüksek öncelikli manifestteki özellikler kullanılır.
  • Şuradaki android:required özelliği: <uses-feature> ve <uses-library> öğede VEYA birleştirme işlemi yapılır. Uyuşmazlık varsa "true" ve bir manifestin gerektirdiği özellik veya kitaplık her zaman dahil edilir.
  • Şuradaki özellikler: <uses-sdk> öğesi, her zaman aşağıdaki durumlar haricinde yüksek öncelikli manifest:
    • Düşük öncelikli manifestte minSdk değeri olduğunda daha yüksekse bir hata alırsınız. overrideLibrary birleştirme kuralı.
    • Düşük öncelikli manifestte targetSdkVersion olduğunda küçük bir değerse, birleştirme aracı manifestodan çıkarılır ve ayrıca sistem izinlerini de ekler. içe aktarılan kitaplığın normal şekilde çalışmaya devam etmesini sağlamak için düzgün şekilde çalışır (daha yüksek Android sürümünün yüklü olduğu izin kısıtlamalarının artırılmasına yol açabilir. Bu konuda daha fazla bilgi için daha fazla bilgi için dolaylı sistem hakkında izinleriyle ilgili daha fazla bilgi edinin.
  • <intent-filter> öğesi hiçbir zaman şunlarla eşleşmez: manifestolarını ekleyebilirsiniz. Her biri benzersiz olarak ele alınır ve birleştirilmiş manifestteki ortak üst öğeye eklendi.

Özellikler arasındaki diğer tüm çakışmalar için hata mesajı alırsınız. birleştirme aracına özel bir özellik ekleyerek manifest dosyasına gönderebilirsiniz. Aşağıdaki bölümde birleştirme kuralı işaretçileri hakkında daha fazla bilgi edinin.

Varsayılan özellik değerlerine güvenmeyin. Çünkü tüm benzersiz özelliklerin aynı öğede birleştirilmesi, daha yüksek öncelikli manifest dosyası aslında belirtmeden bir özelliğin varsayılan değerini belirleyebilir. Örneğin, öncelik manifest'inde android:launchMode bildirilmiyor özelliğiyle, bu durumda varsayılan "standard" değerini kullanır; ancak düşük öncelikli manifesto bu özelliği farklı bir değerle tanımlar. değeri, varsayılan değeri geçersiz kılan birleştirilmiş manifeste uygulanır. Siz her bir özelliği istediğiniz gibi açık bir şekilde tanımlamanız gerekir. Varsayılan değerler manifest referansı.

Kural işaretçilerini birleştirme

Birleştirme kuralı işaretçisi, tercihinizi ifade etmek için kullanabileceğiniz bir XML özelliğidir. birleştirme çakışmalarını giderme veya istenmeyen öğe ve özellikleri kaldırma hakkında bilgi edinin. İşaretçiyi bir öğenin tamamına veya yalnızca belirli bir öğeye uygulayabilirsiniz özellikleridir.

Birleştirme aracı, iki manifest dosyasını birleştirirken bu işaretçileri daha yüksek öncelikli manifest dosyanız.

Tüm işaretçiler Android tools ad alanına ait olduğundan önce aşağıdakileri belirtmeniz gerekir: bu ad alanını, aşağıda gösterildiği gibi <manifest> öğesinde belirtirsiniz:

<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ı bir XML öğesinin tamamına (belirli bir öğedeki tüm özelliklere) manifest öğesine ve tüm alt etiketlerine) aşağıdaki komutu kullanın: özellikler:

tools:node="merge"
Aşağıdaki durumlarda bu etiketteki tüm özellikleri ve iç içe yerleştirilmiş tüm öğeleri birleştir birleştirme kullanılarak çakışma olmaması çatışma bulguları. 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ştir; 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'ten kaldırın. Kullanıldığı durum Birleştirilmiş manifest'inizde ihtiyacınız olmayan bir öğe bulduğunuzda , kontrolünüz dışında düşük öncelikli bir manifest dosyası tarafından sağlandı (içe aktarılan bir kitaplık gibi).

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 benzer, ancak tümünü kaldırır bu öğe türüyle eşleşen öğeler (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 manifest'te eşleşen bir öğedir, bunu yoksayın ve tam olarak bu manifestte göründüğü şekilde ekleyin.

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"
Bu öğe daha düşük öncelikli olduğunda herhangi bir zamanda derleme hatası oluştur manifest dosyası, daha yüksek öncelikli manifestteki öğeyle tam olarak eşleşmiyor ( diğer birleştirme kuralı işaretçileri tarafından çözüldüğünü gösterir). Bu, birleştirme çakışması buluşsal yöntemlerini geçersiz kılar. Örneğin, Örneğin, düşük öncelikli manifest'te ekstra bir özellik varsa başarısız olur (varsayılan davranış ise fazladan özelliği (birleştirilmiş manifesto) ekleyebilirsiniz.

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ç farklılık gösteremez. Diğer birleştirme kuralı işaretçilerini uygulamanız gerekir ortadan kaldırır. (tools:node="strict" olmadan, bu aşağıdaki örnekte gösterildiği gibi, iki dosya hatasız olarak birleştirilebilir: tools:node="merge") dokunun.

Özellik işaretçileri

Bunun yerine, birleştirme kuralını bir öğedeki belirli özelliklere uygulamak için manifest etiketi için aşağıdaki kodu kullanın: özellikleri hakkında daha fazla bilgi edinin. Her özellik bir veya daha fazla özellik adını kabul eder ( özellik ad alanı) kaldırın.

tools:remove="attr, ..."
Belirtilen özellikleri, birleştirilmiş manifest'ten kaldırın. Düşük öncelikli manifest dosyası bunları içerdiğinde kullanılır varsa ve bunların birleştirilmiş manifest'ini kullanabilirsiniz.

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 manifestteki diğer dosyaları içeriyor. Diğer bir deyişle, yüksek öncelikli manifestin değerlerine.

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, ..."
Bu özellikler düşük öncelikli manifest, yüksek öncelikli özelliklerle tam olarak eşleşmiyor manifest'ini kullanabilirsiniz. Aşağıdakiler hariç tüm özellikler için varsayılan davranış budur: birleştirme çatışması buluşsal yöntemlerinde açıklandığı gibi özel davranışlara sahip olan kişiler.

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. Diğer birleştirme kuralını uygulamanız gerekiyor işaretleyici olarak işaretleyin. Bu, varsayılan davranış olduğu için aynı sonuç, tools:strict="screenOrientation"

Ayrıca, 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 belirli bir içe aktarılmış kitaplık varsa, tools:selector özelliğini kitaplık paketinin adını yazın.

Örneğin, aşağıdaki manifestte remove birleştirme kuralı, yalnızca düşük öncelikli manifest dosyası dizinden alındığında uygulanır. com.example.lib1 kitaplığı:

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

Düşük öncelikli manifest başka bir kaynaktan geliyorsa remove birleştirme kuralı yoksayıldı.

Not: Bunu özellik işaretçilerinden biriyle kullanırsanız daha sonra, işaretçide belirtilen tüm özellikler için geçerli olur.

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

Varsayılan olarak, minSdk değerine sahip bir kitaplığı içe aktarırken ana manifest dosyasından daha yüksek olursa bir hata oluşur ve kitaplığı içe aktarılamıyor.

Birleştirme aracının bu çakışmayı yok saymasını ve uygulamanızın minSdk değerini korurken kitaplığı içe aktarın değeri için <uses-sdk> etiketine overrideLibrary özelliğini ekleyin. Özellik değeri bir veya daha fazla kitaplık paketi adı olabilir (virgülle ayırarak) manifest dosyasındaki minSdk.

Örneğin, uygulamanızın ana manifest'inde overrideLibrary uygulanıyorsa aşağıdaki gibidir:

<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 ile ilgili herhangi bir hata olmadan birleştirilebilir: <uses-sdk> etiketini ekler ve birleştirilmiş manifest Uygulama manifest'inden minSdk="2".

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

Dolaylı sistem izinleri

Eskiden uygulamalar tarafından ücretsiz olarak erişilebilen bazı Android API'leri şurada sistem izinleriyle kısıtlandı: Android'in son sürümleri.

Bu özelliklere erişmek isteyen uygulamaların bozulmaması için API'ler gibi, Android'in son sürümleri uygulamaların bu API'lere erişmeye devam etmesini sağlamaktadır. targetSdkVersion daha düşük bir değere ayarlanırsa izin olmadan bu sürüm, kısıtlamanın eklendiği sürümden daha eski olabilir. Bu davranış Uygulamaya, API'lere erişime izin vermek için örtülü bir izin verir. Birleştirilen farklı değerlere sahip manifestler targetSdkVersion etkilenebilir.

Düşük öncelikli manifest dosyasında daha düşük bir targetSdkVersion komutu, örtülü izin verir. ve daha yüksek öncelikli manifest, aynı örtülü izin (targetSdkVersion değerine eşit veya daha yüksek olduğu için) kısıtlamanın eklendiği sürümden farklıysa) birleştirme sistem iznini, birleştirilmiş manifeste açıkça ekler.

Örneğin, uygulamanız targetSdkVersion değerini 4 veya daha yüksek bir değere ayarlar ve bir targetSdkVersion kitaplığı 3 veya daha düşük bir değere ayarlandığında, birleştirme aracı WRITE_EXTERNAL_STORAGE için izin verin.

Tablo 2'de olası tüm izinler listelenmiştir. şu bilgileri de ekleyebilirsiniz:

Tablo 2. Birleştirme aracının izin listesi birleştirilen manifeste eklenebilir

Düşük öncelikli manifest beyanları İzinler, birleştirilmiş manifeste eklendi
targetSdkVersion, 3 veya daha küçük WRITE_EXTERNAL_STORAGE, READ_PHONE_STATE
targetSdkVersion, 15 veya daha düşük bir değer ve READ_CONTACTS kullanıyor READ_CALL_LOG
targetSdkVersion, 15 veya daha düşük bir değer ve WRITE_CONTACTS kullanıyor WRITE_CALL_LOG

Birleştirilmiş manifest'i inceleme ve çakışmaları bulma

Uygulamanızı oluşturmadan önce bile, birleştirdiğiniz uygulamalarınızın önizlemesini görebilirsiniz. nasıl görüneceğini kontrol edebilirsiniz. Ö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ü, birleştirilmiş manifestin sonuçlarını sol tarafta gösterir ve sağda gösterildiği gibi, birleştirilmiş her manifest dosyasıyla ilgili bilgiler Şekil 2.

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

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

Derlemenin parçası olan ancak öğelere katkıda bulunmayan manifest dosyaları veya özellikleri, Diğer Manifest Dosyaları altında listelenir.

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

Herhangi bir çakışma oluşursa Birleştirme Hataları bölümünde görünür. kullanarak çakışmayı nasıl çözeceğinize dair bir öneriyle birleştirme kuralı işaretçileri hakkında daha fazla bilgi edinin.

Hatalar ayrıca Olay Günlüğü penceresinde de yazdırılır. Görüntülemek için Görünüm > Araç Pencereleri > Olay Günlüğü'ne gidin.

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

Politikaları birleştir

Manifest birleştirme aracı, tek bir manifestteki her XML öğesini mantıksal olarak eşleştirebilir dosyasını başka bir dosyadaki karşılık gelen öğeye bağlayabilirsiniz. Birleştirme her öğeyle eşleşir benzersiz bir özellik değeri (ör. android:name) veya eşleşme anahtarı kullanarak Etiketin kendisinin doğal benzersizliği (örneğin, <supports-screen> öğesi).

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

Birleştir
Çakışmayan tüm özellikleri aynı etikette birleştir ve birleştir alt öğeleri ilgili birleştirme politikalarına göre belirler. Herhangi bir birleştirme kuralı işaretçileriyle birleştirin.
Yalnızca alt öğeleri birleştir
Özellikleri birleştirmeyin veya birleştirmeyin (yalnızca sağlanan özellikleri tutun). en yüksek öncelikli manifest dosyasına göre) ve birleştirebilir, alt öğeleri birleştirme politikalarına göre değiştirir.
Keep
Öğeyi olduğu gibi bırakıp birleştirilmiş dosya. Bu, yalnızca birkaç tane itirazın kabul edilebilir olduğu durumlarda kullanılır tanımlamalarıdır.

Tablo 3'te her bir öğe türü, kullanılan birleştirme politikasının türü ve anahtarı:

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

Element Politikayı birleştir 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 tane var.
<category> Birleştir android:name özelliği
<data> Birleştir Her <intent-filter> için yalnızca bir tane var.
<grant-uri-permission> Birleştir Her <provider> için yalnızca bir tane var.
<instrumentation> Birleştir android:name özelliği
<intent-filter> Keep Eşleşme yok; üst öğe içinde birkaç beyana 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 Her <provider> için yalnızca bir tane var.
<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 tane var.
<uses-configuration> Birleştir Her <manifest> için yalnızca bir tane var.
<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 tane var.
Özel öğeler Birleştir Eşleşme yok; bunlar birleştirme aracı tarafından bilinmez ve her zaman dahil edilir.

Derleme değişkenlerini manifest dosyasına girme

AndroidManifest.xml dosyanıza build.gradle dosyanızda tanımlı olarak varsa, bunu manifestPlaceholders mülkü. Bu özellik, anahtar/değer çiftlerinin bir haritasını alır. burada gösterildiği gibi:

Eski

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

Kotlin

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

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

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

Derleme araçları varsayılan olarak, uygulamanızın uygulama kimliği değerini ${applicationId} yer tutucusuna ekleyin. Değer her zaman son Geçerli derlemenin uygulama kimliği: değişikliklerinin nasıl yapılacağını öğrenebilirsiniz. Bu, tanımlayıcılar için benzersiz bir ad alanı kullanmak istediğinizde yararlı olur (ör. amaç işlemi) ekleyebilirsiniz.

Örneğin, build.gradle dosyanız aşağıdaki gibi görünüyorsa:

Eski

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" ifadesini derlediğinizde ortaya çıkan manifest sonucu, ürün aroması şöyle olur:

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

Daha fazla bilgi için Uygulama kimliğini ayarlayın.