Araçlar: Android manifest'te değiştirilmiyor


147

Birçok farklı kütüphane bağımlılığı olan bir gradle projesi ve yeni manifest birleşmesini kullanıyorum. Benim içinde <application />etiketi ben gibi kurdunuz:

<application tools:replace="android:icon, android:label, android:theme, android:name"
    android:name="com.example.myapp.MyApplcation"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/application_name"
    android:logo="@drawable/logo_ab"
    android:theme="@style/AppTheme"
    >
....
</application>

Yine de hata alıyorum:

/android/MyApp/app/src/main/AndroidManifest.xml:29:9        Error:
Attribute application@icon value=(@drawable/ic_launcher) from AndroidManifest.xml:29:9
is also present at {Library Name} value=(@drawable/app_icon)
Suggestion: add 'tools:replace="android:icon"' to <application> element at AndroidManifest.xml:26:5 to override

/android/MyApp/app/src/main/AndroidManifest.xml:30:9 Error:
Attribute application@label value=(@string/application_name) from AndroidManifest.xml:30:9
is also present at {Library Name} value=(@string/app_name)
Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:26:5 to override

/android/MyApp/app/src/main/AndroidManifest.xml:27:9 Error:
Attribute application@name value=(com.example.myapp.MyApplication) from AndroidManifest.xml:27:9
is also present at {Another Library}

Suggestion: add 'tools:replace="android:name"' to <application> element at AndroidManifest.xml:26:5 to override

/android/MyApp/app/src/main/AndroidManifest.xml:32:9 Error:
Attribute application@theme value=(@style/AppTheme) from AndroidManifest.xml:32:9
is also present at {Library Name} value=(@style/AppTheme)
Suggestion: add 'tools:replace="android:theme"' to <application> element at AndroidManifest.xml:26:5 to override

1
Soruları silme ve yeniden gönderme hakkında Meta'daki bu gönderiye bakın: meta.stackoverflow.com/questions/265233/… . Bunu bir kez yapmak size özellikle zarar vermez, ancak düzenli bir uygulama yapmak iyi olmaz.
Scott Barta

1
Sanırım <application>projede tekrarlanan etiket var . Pls sadece bir tane olmasını sağlar <application>.
Panther

Bir projede, özellikle herhangi bir sayıda kütüphane alt modülünü kullanıyorsanız, birçok <application> etiketi olabilir.
agrosner

Bunun işe yaradığı durumlara örneklerim var. Android oluşturma araçlarının hangi sürümünü kullanıyorsunuz?
G. Blake Meike

Yanıtlar:


233

Manifest başlığınızı böyle ilan edin

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

Ardından, uygulama etiketinize aşağıdaki özelliği ekleyebilirsiniz:

<application
    tools:replace="icon, label" ../>

Örneğin, simgeyi ve etiketi değiştirmem gerekiyor. İyi şanslar!


1
meta-veri ile android: adı nasıl ele alırsınız? android: name = "com.orm.SugarApp"> <meta veriler android: name = "DATABASE" android: değer = "sv_logs.db" /> <meta veri android: name = "VERSION" android: value = " 3 "/> <meta veri android: ad =" QUERY_LOG "android: değer =" doğru "/> <meta veri android: ad =" DOMAIN_PACKAGE_NAME "android: değer =" com.example.app "/>
Alan

@Alan Meta veri etiketinin tamamını şöyle değiştirin tools:node="replace": <meta-data tools:node="replace" android:name="QUERY_LOG" android:value="true" />etc.
Blacklight

25
Kafam karıştı. Sorusunda tam olarak yaptığı bu değil mi?
Jason Robinson

tools:replaceUygulama etiketine, değiştirilmesi gereken kaynağı değil, onu değiştirmesi gerektiğini ekledim . Bu yüzden uygulamam, kütüphanemde tanımlanan şeyin yerini alıyor. "Ne değiştirilebilir" yerine "ne değiştirilmelidir" diyorsunuz. Umarım bu soruları temizler.
WarrenFaith

1
Değiştirilen özellik manifest etiketindeyse, etiketin tools:replace="android:versionCode, android:versionName"içinde olmalıdır <manifest >.
Ivan Chau

42

Aynı sorunu çözdüm. Benim için çözüm:

  1. xmlns:tools="http://schemas.android.com/tools"manifest etiketine satır ekle
  2. tools:replace=..manifest etiketine ekle
  3. android:label=...manifest etiketinde hareket et

Misal:

 <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
              tools:replace="allowBackup, label"
              android:allowBackup="false"
              android:label="@string/all_app_name"/>

1
Bunun için teşekkürler, <manifest>doğrudan yerine yerine eklemek <application>sorunumu gideren tek şeydi.
A. Sokol

1
Benim için çalışmadı, araçları koymak gerekir: replace = "android: allowBackup, android: label" ne de sadece tools: replace = "allowBackup, label".
jmarkstar

1
Bunun çalıştığından emin misiniz? Çünkü benim için allowBackup'ı yanlış yere yazıyorsunuz ve birleştirme işleminden sonra Kütüphanenin manifestinde belirttiği şey geçerli. Üstüne taşıdıktan sonra bir çatışmanız yok, çünkü sadece yanlış yapıyorsunuz ( developer.android.com/guide/topics/manifest/… ) AllowBackup, Application öğesine aittir.
Reinherd

2
[... yukarıdan devam ediyor] BU ÇALIŞMIYOR. AllowBackup'ı yanlış yere yazıyorsunuz ve birleştirme işleminden sonra, manifest'te belirtilen Kütüphanenin hüküm sürdüğünü. Üstüne taşıdıktan sonra bir çatışmanız yok, çünkü sadece yanlış yapıyorsunuz ( developer.android.com/guide/topics/manifest/… ) AllowBackup, Application öğesine aittir. Bir
APK'yı çözerek

38

Gradle dosyanızdaki bağımlılıklarınızı yeniden sıralamayı deneyin. Soruna neden olan kütüphaneyi listenin altından üste taşımak zorunda kaldım ve işe yaradı.


lütfen bana bir şey araçları söyle: yerine benim proje manifest uygulama etiketi içine veya kitaplığımın uygulama etiketi içine eklemek gerekir lütfen bana benim için gerçekten yararlı olacağını söyle ??
Sudhanshu Gaur

@SudhanshuGaur Sadece projenizin AndroidManifest.xml dosyasına eklemeniz gerekir.
Kyle Liu

74
İşe yaradı. Ancak bu tür çözümler insanlıktan iman çıkarabilir.
Vinay Patil

8
Bunlar gibi #android gotchas android için oldukça can sıkıcı bir hale getiriyor
Taylor Halliday

1
Oyun ve oyun dışı gibi birden çok ürün çeşidiniz varsa ve bağımlılık "playReleaseCompile ______" ise, ifadeyi en üste taşımak işe yaramayabilir, ifadeyi "______ derlemek" olarak değiştirmeniz ve ardından üst. O zaman çalışmalı.
Soham

33

Ben sadece tools:replace=...OP tarafından açıklanan aynı davranış yaşadı .

tools:replaceManifest birleşmesi tarafından göz ardı edilmesinin temel nedeninin burada açıklanan bir hata olduğu ortaya çıktı . Temel olarak, projenizde <application ...>bir tools:ignore=...öznitelik içeren bir düğüme sahip bir manifest içeren bir kitaplığınız varsa tools:replace=..., ana modülünüzün manifestindeki özniteliğin göz ardı edileceği anlamına gelir.

Buradaki zor nokta, bunun olabileceği , ancak olması gerekmediğidir. Benim durumumda iki kütüphane vardı, tools:ignore=...öznitelikli A kütüphanesi, ilgili manifestlerde değiştirilecek özniteliklere sahip B kütüphanesi tools:replace=...ve ana modülün manifestinde öznitelik. B manifest'i A manifestinden önce ana manifest ile birleştirildiyse, her şey beklendiği gibi çalıştı. Birleştirme sırasının tersinde hata ortaya çıktı.

Bu birleşmelerin gerçekleşme sırası biraz rasgele görünüyor. Benim durumumun bağımlılıklar bölümündeki sırasını değiştirmenin build.gradlehiçbir etkisi yoktu ama lezzetin adını değiştirdi.

Bu nedenle, tek güvenilir çözüm kitaplığa neden olan sorunu açmak, tools:ignore=...etiketi kaldırmaktır (bu sadece tiftik için bir ipucu olduğu için sorun olmamalı) ve kütüphaneyi tekrar paketlemek gibi görünüyor.

Ve hatanın düzeltilmesi için davaya oy verin.


Benim durumumda araçları kaldırmak zorunda kaldım: kütüphanemden değil,
projemden yoksay

3
Bu da benim meselemdi. Araçları taşıdı: Düğümden <manifest>düğümü yoksay <application>ve işe yaradı.
Jacob Tabak

Bazel v2.0.0 ile de aynı sorunla karşılaştık burada bir hata açtı github.com/bazelbuild/bazel/issues/10543
Nick Korostelev

18

Benim için Nihai Çalışma Çözümü (Örnek koddaki işaretleri vurguladı):

  1. xmlns:toolsmanifest etiketine satır ekle
  2. tools:replaceuygulama etiketine ekle

Misal:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="pagination.yoga.com.tamiltv"
    **xmlns:tools="http://schemas.android.com/tools"**
    >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        **tools:replace="android:icon,android:theme"**
        >

13

Benim için eksik olan parça şuydu:

xmlns:tools="http://schemas.android.com/tools"

Örneğin:

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

Kodunuzu tam olarak <manifest ...> içinde nasıl kullandığınızı paylaşabilir misiniz?
partizan

8

Manifest uygulama etiketinizdekileri değiştirebilirsiniz:

<application
    tools:replace="android:icon, android:label, android:theme, android:name,android:allowBackup"
android:allowBackup="false"...>

ve sizin için çalışacaktır.


tools:replace="android:label"
Herhangi bir

4

ONU DÜZELTTİ KESİN HATA OLDU, Sadece bu araçları ekleyin: replace = "android: simge, android: tema"

senin içine uygulama Manifest'inizde etiketi, sadece para cezası işleri,


bu normal bir şey. konu hakkında normal bir davranış değildir bazı durumlarda bile araçları oluşur: replace added.
David

4

Manifest applicationetiketinizdekileri değiştirebilirsiniz :

<application
    ...
    tools:replace="android:label, android:icon, android:theme"/>

ve sizin için çalışacaktır.

açıklama

gradleDosyanızda, Manifest'in uygulama etiketinde bu etiketlerin bulunduğu böyle bir bağımlılık / kitaplık kullanmak bu soruna neden olabilir ve bunları sizin yerinizde değiştirmek Manifestçözümdür.


1

Aşağıdaki kesmek çalışır:

  1. xmlns:tools="http://schemas.android.com/tools"manifest etiketine satır ekle
  2. tools:replace="android:icon,android:theme,android:allowBackup,label" uygulama etiketine ekle

1

Benim sorunum temel modül, uygulama modülü ve özellik modülü ile çoklu modüller projesi. Her modülün kendi AndroidManifest'i var ve hata ayıklama ve ana için yapı varyantı uyguladım. Bu nedenle, sadece "android: name" in sadece hata ayıklama ve sadece ana Manifest'te bildirildiğinden ve alt modülde herhangi bir Manifest'te ayarlanmadığından emin olmalıyız. Örn: Genel bildirim:

 <application
        android:name=".App"/>

Hata ayıklamadaki bildirim:

<application
        tools:replace="android:name"
        android:name=".DebugApp"
        />

Bunun gibi diğer Manifest dosyalarında "android: name" ayarlamayın:

<application android:name=".App">

Sadece böyle bir özellik modülünde tanımlayın ve iyi bir şekilde birleşecek

<application> 

0

İçe aktardığım bir projede benzer bir hata alıyordum:

Aynı anahtarla birden çok giriş: android: icon = REPLACE ve araçlar: icon = REPLACE

Uygulama etiketi içinde aşağıdaki satırı değiştirdikten sonra düzeltildi:

tools:replace="icon, label, theme"

için

tools:replace="android:icon, android:label, android:theme"

0

Ben de bu sorunu yaşadım ve değiştirdim:

<application  android:debuggable="true" android:icon="@drawable/app_icon" android:label="@string/app_name" android:supportsRtl="true" android:allowBackup="false" android:fullBackupOnly="false" android:theme="@style/UnityThemeSelector">

için

 <application tools:replace="android:allowBackup" android:debuggable="true" android:icon="@drawable/app_icon" android:label="@string/app_name" android:supportsRtl="true" android:allowBackup="false" android:fullBackupOnly="false" android:theme="@style/UnityThemeSelector">

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.