เครื่องมือ: แทนที่ไม่แทนที่ในรายการ Android


147

ฉันกำลังใช้โครงการ gradle ที่มีการขึ้นต่อกันหลายไลบรารีและใช้การรวมรายการใหม่ ใน<application />แท็กของฉันฉันได้ตั้งค่าเช่น:

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

แต่ฉันได้รับข้อผิดพลาด:

/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
ดูโพสต์นี้ใน Meta เกี่ยวกับการลบและคำถามใหม่โพสต์: meta.stackoverflow.com/questions/265233/... การทำเช่นนี้จะไม่เป็นอันตรายต่อคุณโดยเฉพาะ แต่จะไม่เป็นการดีหากคุณจะฝึกฝนเป็นประจำ
Scott Barta

1
ฉันเดาว่ามี<application>แท็กซ้ำในโครงการ <application>กรุณาให้แน่ใจว่ามีเพียงคนเดียว
Panther

อาจมีแท็ก <application> จำนวนมากในโครงการโดยเฉพาะถ้าคุณใช้ submodules ของห้องสมุด
agrosner

ฉันมีตัวอย่างของกรณีที่ใช้งานได้ดี คุณกำลังใช้เครื่องมือสร้างรุ่น Android รุ่นใด
G. Blake Meike

คุณเพิ่ม xmlns: tools = " schemas.android.com/tools " ในแท็กรายการหรือไม่ tools.android.com/tech-docs/new-build-system/user-guide/ ......
TouchBoarder

คำตอบ:


233

ประกาศส่วนหัวรายการของคุณเช่นนี้

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

จากนั้นคุณสามารถเพิ่มแอปพลิเคชันของคุณในแอตทริบิวต์ต่อไปนี้:

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

ตัวอย่างเช่นฉันต้องการแทนที่ไอคอนและป้ายกำกับ โชคดี!


1
คุณจัดการ android อย่างไร: ตั้งชื่อด้วย 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 เพียงแทนที่เมตาดาต้าทั้งแท็กด้วยtools:node="replace": <meta-data tools:node="replace" android:name="QUERY_LOG" android:value="true" />และอื่น ๆ
Blacklight

25
ฉันสับสน นั่นไม่ใช่สิ่งที่เขาทำในคำถามของเขาใช่ไหม
เจสันโรบินสัน

ฉันเพิ่มลงtools:replaceในแท็กแอปพลิเคชันของฉันที่ควรแทนที่ไม่ใช่แหล่งที่ควรแทนที่ ดังนั้นแอปของฉันจึงปรากฏแทนที่สิ่งที่กำหนดไว้ในห้องสมุดของฉัน คุณพูดว่า "สิ่งที่ควรแทนที่" แทนที่จะเป็น "สิ่งที่สามารถแทนที่ได้" ฉันหวังว่าจะทำความสะอาดคำถาม
WarrenFaith

1
หากแอตทริบิวต์ที่ถูกแทนที่อยู่ในรายการแท็กtools:replace="android:versionCode, android:versionName"จะต้องอยู่ภายใน<manifest >แท็ก
Ivan Chau

42

ฉันแก้ไขปัญหาเดียวกัน ทางออกสำหรับฉัน:

  1. เพิ่มxmlns:tools="http://schemas.android.com/tools"บรรทัดในแท็กรายการ
  2. เพิ่มtools:replace=..ในแท็กรายการ
  3. ย้ายandroid:label=...ในแท็กรายการ

ตัวอย่าง:

 <?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
ขอบคุณสำหรับสิ่งนี้การเพิ่มลงใน<manifest>โดยตรงแทนที่จะ<application>เป็นภายใต้เป็นสิ่งเดียวที่แก้ไขปัญหาของฉัน
A. Sokol

1
ฉันไม่ได้ทำงานให้ฉันฉันควรวางเครื่องมือ: replace = "android: allowBackup, android: label" หรือแค่เครื่องมือ: replace = "allowBackup, label"
jmarkstar

1
คุณแน่ใจหรือว่านี่ใช้งานได้? เพราะสำหรับฉันดูเหมือนว่าคุณกำลังเขียนอนุญาตให้สำรองข้อมูลในสถานที่ที่ไม่ถูกต้องและหลังจากที่ผสานสิ่งที่ห้องสมุดระบุไว้ในรายการของเขาจะมีชัย คุณไม่มีข้อขัดแย้งหลังจากย้ายไปด้านบนเพราะคุณเพิ่งทำผิด ( developer.android.com/guide/topics/manifest/ ...... ) AllowBackup เป็นองค์ประกอบของแอปพลิเคชัน
เพิ่ม

2
[... ดำเนินการต่อจากด้านบน] สิ่งนี้ไม่ทำงาน คุณกำลังเขียน allowBackup ในตำแหน่งที่ไม่ถูกต้องและหลังจากการผสานแล้วสิ่งที่ Library ระบุไว้ในรายการของเขาจะมีชัย คุณไม่มีข้อขัดแย้งหลังจากย้ายไปด้านบนเนื่องจากคุณเพิ่งทำผิด ( developer.android.com/guide/topics/manifest/ ...... ) AllowBackup เป็นองค์ประกอบของแอปพลิเคชัน ผมได้ทดสอบได้โดยการ decompiling APK ที่และประจักษ์สุดท้ายมีค่าเป็น TRUE แทน FALSE เป็นฉันที่กำหนดตามที่คุณแนะนำ
Reinherd

38

ลองจัดเรียงการอ้างอิงของคุณใหม่ในไฟล์ gradle ฉันต้องย้ายห้องสมุดที่ละเมิดจากด้านล่างของรายการไปยังด้านบนสุดแล้วก็ใช้งานได้


โปรดบอกฉันว่ามีเครื่องมือหนึ่งอย่าง: แทนที่ฉันควรจะเพิ่มแอปพลิเคชันนี้ในแท็กแอปพลิเคชันของรายการของฉันหรือในแท็กแอปพลิเคชันของห้องสมุดของฉันโปรดบอกฉันว่าจะมีประโยชน์จริงๆสำหรับฉัน?
Sudhanshu Gaur

@SudhanshuGaur คุณเพียงแค่เพิ่มไฟล์ลงในไฟล์ AndroidManifest.xml ของโครงการของคุณ
Kyle Liu

74
มันได้ผล แต่การแก้ปัญหาดังกล่าวอาจทำให้เกิดศรัทธาจากมนุษยชาติ
Vinay Patil

8
#android gotchas เช่นนี้ทำให้การพัฒนาหุ่นยนต์น่ารำคาญทีเดียว
Taylor Halliday

1
ในกรณีที่คุณมีรสชาติผลิตภัณฑ์ที่หลากหลายเช่นการเล่นและไม่ใช่การเล่นและการอ้างอิงคือ "playReleaseCompile ______" การย้ายคำสั่งไปด้านบนอาจไม่ทำงานคุณอาจต้องเปลี่ยนคำสั่งเป็น "รวบรวม ______" แล้วย้ายไปที่ ด้านบน มันควรจะทำงานแล้ว
Soham

33

ฉันเพิ่งพบกับพฤติกรรมเดียวกันtools:replace=...กับที่อธิบายโดย OP

มันกลับกลายเป็นว่าสาเหตุการtools:replaceถูกละเลยจากการควบรวมกิจการอย่างชัดแจ้งเป็นข้อผิดพลาดที่อธิบายไว้ที่นี่ โดยทั่วไปหมายความว่าถ้าคุณมีห้องสมุดในโครงการของคุณที่มีรายการที่มี<application ...>โหนดที่มีtools:ignore=...แอตทริบิวต์มันสามารถเกิดขึ้นได้ว่าtools:replace=...แอตทริบิวต์ในรายการของโมดูลหลักของคุณจะถูกละเว้น

จุดหากินที่นี่คือมันสามารถเกิดขึ้นได้ แต่ไม่จำเป็นต้อง ในกรณีของฉันฉันมีสองไลบรารีไลบรารี่ A ที่มีtools:ignore=...แอ็ตทริบิวต์ไลบรารี B พร้อมแอ็ตทริบิวต์ที่จะถูกแทนที่ในรายการที่เกี่ยวข้องและtools:replace=...แอ็ตทริบิวต์ในรายการของโมดูลหลัก หากการรวมกันของ B ถูกรวมเข้าไปในรายการหลักก่อนที่รายการของ A ทุกอย่างทำงานตามที่คาดไว้ ในการรวมที่ตรงข้ามข้อผิดพลาดปรากฏขึ้น

ลำดับที่การรวมเหล่านี้เกิดขึ้นดูเหมือนจะค่อนข้างสุ่ม ในกรณีของฉันการเปลี่ยนลำดับในส่วนการพึ่งพาของbuild.gradleไม่มีผล แต่เปลี่ยนชื่อของรสชาติได้

ดังนั้นวิธีแก้ปัญหาที่เชื่อถือได้เพียงอย่างเดียวดูเหมือนว่าจะแกะปัญหาที่ทำให้ไลบรารีเอาtools:ignore=...แท็กออก (ซึ่งไม่น่าจะมีปัญหาเพราะเป็นคำแนะนำสำหรับขุยเท่านั้น) และบรรจุไลบรารีอีกครั้ง

และลงคะแนนให้ข้อผิดพลาดที่จะแก้ไขสาเหตุ


ในกรณีของฉันฉันต้องลบเครื่องมือ: ละเว้นจากโครงการของฉันไม่ใช่จากหนึ่งในห้องสมุด
mohax

3
นี่ก็เป็นปัญหาของฉันเช่นกัน ย้ายเครื่องมือ: ละเว้นไปยัง<manifest>โหนดจาก<application>โหนดและใช้งานได้
Jacob Tabak

เพิ่งพบปัญหาเดียวกันกับ Bazel v2.0.0 ยื่นข้อผิดพลาดที่นี่github.com/bazelbuild/bazel/issues/10543
Nick Korostelev

18

วิธีแก้ปัญหาการทำงานขั้นสุดท้ายสำหรับฉัน (เน้น tages ในรหัสตัวอย่าง):

  1. เพิ่มxmlns:toolsบรรทัดในแท็กรายการ
  2. เพิ่มtools:replaceในแท็กแอปพลิเคชัน

ตัวอย่าง:

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

ชิ้นส่วนที่ขาดหายไปสำหรับฉันคือ:

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

ตัวอย่างเช่น:

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

คุณสามารถแชร์รหัสของคุณได้อย่างไรใน <manifest ... >
ปาร์ติซาน

8

คุณสามารถแทนที่สิ่งเหล่านั้นในแท็กแอปพลิเคชัน Manifest ของคุณ:

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

และจะทำงานให้คุณ


มันใช้งานไม่ได้ด้วยเหตุผลบางอย่าง .... ฉันพยายามที่จะเพิ่มtools:replace="android:label"แอปพลิเคชัน แต่มันไม่ทำงาน
iKK

4

แก้ไขแล้วมี ข้อผิดพลาดที่แน่นอนเพียงเพิ่มเครื่องมือนี้: แทนที่ = "android: ไอคอน, android: theme"

ในแท็กแอปพลิเคชันของคุณในรายการของคุณทำงานได้ดี


มันเป็นเรื่องปกติ สิ่งที่เป็นหัวข้อเกี่ยวกับพฤติกรรมที่ไม่ปกติเกิดขึ้นในบางกรณีเมื่อมีเครื่องมือ: แทนที่เพิ่ม
David

4

คุณสามารถแทนที่สิ่งเหล่านั้นในapplicationแท็กรายการของคุณ:

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

และจะทำงานให้คุณ

คำอธิบาย

การใช้การพึ่งพา / ไลบรารีดังกล่าวในgradleไฟล์ของคุณซึ่งมีป้ายกำกับเหล่านั้นในแท็กแอปพลิเคชันของ Manifest อาจทำให้เกิดปัญหานี้และการแทนที่พวกเขาในของคุณManifestคือทางออก


1

แฮ็คต่อไปนี้ใช้งานได้:

  1. เพิ่มxmlns:tools="http://schemas.android.com/tools"บรรทัดในแท็กรายการ
  2. เพิ่ม tools:replace="android:icon,android:theme,android:allowBackup,label" ในแท็กแอปพลิเคชัน

1

ปัญหาของฉันคือโครงการโมดูลหลายโมดูลพร้อมโมดูลฐานโมดูลแอพและโมดูลคุณสมบัติ แต่ละโมดูลมี AndroidManifest ของตัวเองและฉันใช้สร้างตัวแปรสำหรับการแก้ปัญหาและหลัก ดังนั้นเราต้องแน่ใจว่า "android: name" เพิ่งประกาศใน Manifest ของ debug และ main เท่านั้นและไม่ได้กำหนดไว้ใน Manifest ใด ๆ ในโมดูลลูก ตัวอย่าง: ประกาศในหลัก:

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

แสดงรายการในการแก้ปัญหา:

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

อย่าตั้ง "android: name" ในไฟล์ Manifest อื่น ๆ เช่นนี้:

<application android:name=".App">

เพียงแค่กำหนดในโมดูลคุณสมบัติเช่นนี้และมันจะถูกรวมเข้าด้วยกัน

<application> 

0

ฉันได้รับข้อผิดพลาดที่คล้ายกันในโครงการที่ฉันนำเข้า:

มีหลายรายการที่มีคีย์เดียวกัน: android: icon = REPLACE และ tools: icon = REPLACE

แก้ไขหลังจากเปลี่ยนบรรทัดด้านล่างภายในแท็กแอปพลิเคชัน:

tools:replace="icon, label, theme"

ถึง

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

0

ฉันยังเจอปัญหานี้และเปลี่ยนที่:

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

ถึง

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.