Alat: ganti tidak diganti dalam manifes Android

147

Saya menggunakan proyek gradle dengan banyak dependensi perpustakaan berbeda dan menggunakan merger manifes baru. Di <application />tag saya, saya mengaturnya seperti ini:

<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>

Namun saya menerima kesalahan:

/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
agrosner
sumber
1
Lihat posting ini di Meta tentang menghapus dan memposting ulang pertanyaan: meta.stackoverflow.com/questions/265233/… . Melakukan hal ini sekali tidak akan terlalu membahayakan Anda, tetapi tidak baik untuk melakukan latihan secara teratur.
Scott Barta
1
Saya kira ada <application>tag yang diulang dalam proyek. Tolong pastikan hanya ada satu <application>.
Panther
Mungkin ada banyak tag <aplikasi> dalam suatu proyek terutama jika Anda menggunakan sejumlah submodul perpustakaan.
agrosner
Saya punya contoh kasus di mana ini berfungsi dengan baik. Versi Android build tools apa yang Anda gunakan?
G. Blake Meike
apakah Anda menambahkan xmlns: tools = " schemas.android.com/tools " di tag manifes? tools.android.com/tech-docs/new-build-system/user-guide/…
TouchBoarder

Jawaban:

233

Nyatakan header manifes Anda seperti ini

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

Kemudian Anda dapat menambahkan atribut ke tag aplikasi Anda sebagai berikut:

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

Misalnya saya perlu mengganti ikon dan label. Semoga berhasil!

Andrus
sumber
1
bagaimana Anda menangani android: name dengan meta-data? android: name = "com.orm.SugarApp"> <meta-data android: name = "DATABASE" android: value = "sv_logs.db" /> <meta-data android: name = "VERSION" android: value = " 3 "/> <meta-data android: name =" QUERY_LOG "android: value =" true "/> <meta-data android: name =" DOMAIN_PACKAGE_NAME "android: value =" com.example.app "/>
Alan
@Alan Cukup ganti seluruh tag meta-data dengan tools:node="replace": <meta-data tools:node="replace" android:name="QUERY_LOG" android:value="true" />dll.
Blacklight
25
Saya bingung. Bukankah itu tepatnya yang dia lakukan dalam pertanyaannya?
Jason Robinson
Saya menambahkan tools:replacetag aplikasi saya yang harus menggantikannya dan bukan sumber yang harus diganti. Jadi manifes aplikasi saya menggantikan apa yang didefinisikan di perpustakaan saya. Anda mengatakan "apa yang harus diganti" alih-alih "apa yang bisa diganti". Saya harap itu membersihkan pertanyaan.
WarrenFaith
1
Jika atribut yang diganti berada dalam tag manifes, maka tools:replace="android:versionCode, android:versionName"harus di dalam <manifest >tag.
Ivan Chau
42

Saya memperbaiki masalah yang sama. Solusi untuk saya:

  1. tambahkan xmlns:tools="http://schemas.android.com/tools"baris dalam tag manifes
  2. tambahkan tools:replace=..tag manifes
  3. pindah android:label=...di tag manifes

Contoh:

 <?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"/>
Stefan K
sumber
1
Terima kasih untuk ini, menambahkannya <manifest>secara langsung dan bukan di bawah <application>adalah satu-satunya hal yang memperbaiki masalah saya.
A. Sokol
1
Saya tidak bekerja untuk saya, saya harus meletakkan alat: replace = "android: allowBackup, android: label" atau hanya alat: replace = "allowBackup, label".
jmarkstar
1
Apakah Anda yakin ini berfungsi? Karena bagi saya, sepertinya Anda sedang menulis allowBackup di tempat yang salah, dan setelah penggabungan, yang ditentukan oleh Perpustakaan pada manifesnya, berlaku. Anda tidak memiliki konflik setelah memindahkannya di atas, karena Anda hanya salah melakukannya ( developer.android.com/guide/topics/manifest/… ) AllowBackup milik elemen Aplikasi.
Reinherd
2
[... berlanjut dari atas] INI TIDAK BEKERJA. Anda sedang menulis allowBackup di tempat yang salah, dan setelah penggabungan, apa yang ditentukan Perpustakaan pada manifesnya, berlaku. Anda tidak memiliki konflik setelah memindahkannya di atas, karena Anda hanya salah melakukannya ( developer.android.com/guide/topics/manifest/… ) AllowBackup milik elemen Aplikasi. Saya telah mengujinya dengan mendekompilasi APK, dan manifes akhir memiliki nilai BENAR daripada SALAH seperti yang saya sebutkan seperti yang Anda sarankan
Reinherd
38

Coba atur ulang dependensi Anda dalam file gradle Anda. Saya harus memindahkan perpustakaan yang menyinggung dari bagian bawah daftar ke atas, dan kemudian berhasil.

Lagu
sumber
tolong beri tahu saya satu alat hal: ganti harus saya tambahkan ini tag aplikasi dalam manifes proyek saya atau di dalam tag aplikasi perpustakaan saya tolong katakan padaku itu akan sangat membantu bagi saya ??
Sudhanshu Gaur
@SudhanshuGaur Anda hanya perlu menambahkannya ke file AndroidManifest.xml proyek Anda.
Kyle Liu
74
Itu berhasil. Tetapi solusi semacam itu bisa mengambil kepercayaan dari kemanusiaan.
Vinay Patil
8
# android gotchas seperti ini membuat pengembangan untuk android cukup menyebalkan
Taylor Halliday
1
Jika Anda memiliki beberapa rasa produk seperti permainan dan non-bermain dan ketergantungannya adalah "playReleaseCompile ______", hanya memindahkan pernyataan ke atas mungkin tidak berfungsi, Anda mungkin harus mengubah pernyataan menjadi "kompilasi ______" dan kemudian memindahkannya ke puncak. Itu harus bekerja kalau begitu.
Soham
33

Saya baru saja mengalami perilaku yang sama tools:replace=...seperti yang dijelaskan oleh OP.

Ternyata penyebab utama tools:replacediabaikan oleh merger manifes adalah bug yang dijelaskan di sini . Ini pada dasarnya berarti bahwa jika Anda memiliki pustaka di proyek Anda yang berisi manifes dengan <application ...>simpul yang berisi tools:ignore=...atribut, dapat terjadi bahwa tools:replace=...atribut dalam manifes modul utama Anda akan diabaikan.

Poin rumit di sini adalah hal itu bisa terjadi, tetapi tidak harus. Dalam kasus saya, saya memiliki dua perpustakaan, perpustakaan A dengan tools:ignore=...atribut, perpustakaan B dengan atribut yang akan diganti dalam manifes masing-masing dan tools:replace=...atribut dalam manifes modul utama. Jika manifes B digabungkan ke manifes utama sebelum manifes A semuanya bekerja seperti yang diharapkan. Dalam urutan penggabungan yang berlawanan, kesalahan muncul.

Urutan penggabungan ini tampaknya agak acak. Dalam kasus saya mengubah urutan di bagian dependensi build.gradletidak berpengaruh tetapi mengubah nama rasa melakukannya.

Jadi, satu-satunya solusi yang dapat diandalkan tampaknya adalah membongkar masalah yang menyebabkan pustaka, menghapus tools:ignore=...tag (yang seharusnya tidak menjadi masalah karena ini adalah petunjuk untuk hanya serat) dan kemas pustaka lagi.

Dan pilih bug untuk diperbaiki, karena sebab.

Nantoka
sumber
Dalam kasus saya, saya harus menghapus alat: abaikan dari proyek saya, bukan dari salah satu perpustakaan
mohax
3
Ini juga masalah saya. Memindahkan alat: abaikan ke <manifest>simpul dari <application>simpul dan itu berhasil.
Jacob Tabak
Baru saja mengalami masalah yang sama dengan Bazel v2.0.0 mengajukan bug di sini github.com/bazelbuild/bazel/issues/10543
Nick Korostelev
18

Solusi Pekerjaan Akhir untuk saya (Soroti tages dalam kode sampel):

  1. tambahkan xmlns:toolsbaris dalam tag manifes
  2. tambahkan tools:replacetag aplikasi

Contoh:

<?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"**
        >
Yogamurthy
sumber
13

Bagian yang hilang bagi saya adalah ini:

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

sebagai contoh:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
    package="com.your.appid">
partizan
sumber
Bisakah Anda membagikan kode persis seperti yang Anda miliki di <manifes ...>?
partizan
8

Anda dapat mengganti yang ada di tag aplikasi Manifest Anda:

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

dan akan bekerja untuk Anda.

Saurabh Gaddelpalliwar
sumber
Itu tidak berfungsi karena beberapa alasan .... Saya mencoba untuk menambah tools:replace="android:label"aplikasi tetapi tidak berhasil
iKK
4

TETAPI MEMILIKI KESALAHAN PERSIS, Cukup tambahkan alat ini: replace = "android: icon, android: theme"

ke dalam tag aplikasi Anda di manifes Anda, itu berfungsi dengan baik,

Ismail ozil
sumber
itu hal yang normal. apa topik tentang perilaku yang tidak normal terjadi dalam beberapa kasus ketika bahkan alat: ganti ditambahkan.
David
4

Anda dapat mengganti yang ada di applicationtag Manifest Anda :

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

dan akan bekerja untuk Anda.

Penjelasan

Menggunakan dependensi / pustaka seperti itu di gradlefile Anda yang memiliki label-label itu di tag aplikasi Manifest dapat menghasilkan masalah ini dan menggantinya dengan Anda Manifestadalah solusinya.

blueware
sumber
1

Retasan berikut ini berfungsi:

  1. tambahkan xmlns:tools="http://schemas.android.com/tools"baris dalam tag manifes
  2. tambahkan tools:replace="android:icon,android:theme,android:allowBackup,label" tag aplikasi
Shoaib Ahmed
sumber
1

Masalah saya adalah proyek multi modul dengan modul dasar, modul aplikasi, dan modul fitur. Setiap modul memiliki AndroidManifest sendiri, dan saya mengimplementasikan varian build untuk debug dan main. Jadi kita harus yakin bahwa "android: name" baru saja dideklarasikan di Manifest dari debug dan utama saja, dan jangan mengaturnya dalam modul Manifest in child. Mis: Manifes dalam main:

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

Manifes dalam debug:

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

Jangan set "android: name" di file Manifest lain seperti ini:

<application android:name=".App">

Cukup tentukan dalam modul fitur seperti ini dan itu akan bergabung dengan baik

<application> 
Hoang Minh
sumber
0

Saya menerima kesalahan serupa pada proyek yang saya impor:

Banyak entri dengan kunci yang sama: android: icon = REPLACE dan alat: icon = REPLACE

Diperbaiki setelah mengubah baris di bawah ini dalam tag aplikasi:

tools:replace="icon, label, theme"

untuk

tools:replace="android:icon, android:label, android:theme"
brybry
sumber
0

Saya juga mengalami masalah ini dan mengubahnya:

<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">

untuk

 <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">
Saeed Aliakbari
sumber
0
 tools:replace="android:supportsRtl,android:allowBackup,icon,label">
studio android
sumber