도구 : 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.stackoverflow.com/questions/265233/… 질문을 삭제하고 다시 게시하는 방법에 대해서는 Meta의이 게시물을 참조하십시오 . 이 작업을 한 번 수행해도 특별히 해를 끼치지는 않지만 정기적으로 연습하는 것은 좋지 않습니다.
Scott Barta

1
<application>프로젝트에 태그가 반복되는 것 같습니다 . Pls는 하나만 있는지 확인하십시오 <application>.
Panther

라이브러리 하위 모듈을 여러 개 사용하는 경우 프로젝트에 많은 <application> 태그가있을 수 있습니다.
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 : name을 어떻게 처리합니까? 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 간단히 전체 메타 데이터 태그를 tools:node="replace"다음 과 같이 바꾸십시오 <meta-data tools:node="replace" android:name="QUERY_LOG" android:value="true" />.
Blacklight

25
혼란 스러워요. 그가 그의 질문에 정확히 무엇을하고 있지 않습니까?
Jason Robinson

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
나는 나를 위해 일하지 않았다, 나는 tools : replace = "android : allowBackup, android : label"또는 tools : replace = "allowBackup, label"을 넣어야한다.
jmarkstar

1
이것이 효과가 있습니까? 나를 위해, 당신이 잘못된 장소에 allowBackup을 작성하고있는 것처럼 보이고 병합 후에 라이브러리가 그의 매니페스트에 지정한 것이 우선합니다. 잘못된 동작으로 인해 충돌이 발생하지 않습니다 ( developer.android.com/guide/topics/manifest/… ) AllowBackup은 Application 요소에 속합니다.
Reinherd

2
[... 위에서 계속]이 작동하지 않습니다. allowBackup을 잘못된 위치에 작성하고 있으며 병합 후에 라이브러리가 자신의 매니페스트에 지정한 것이 우선합니다. 잘못된 동작으로 인해 충돌이 발생하지 않습니다 ( developer.android.com/guide/topics/manifest/… ) AllowBackup은 Application 요소에 속합니다. 나는 APK를 디 컴파일하여 테스트 한, 나는 지정된대로 제안 최종 매니페스트 대신 FALSE로 TRUE로 값을했다
Reinherd

38

gradle 파일에서 종속성을 재정렬하십시오. 문제가되는 라이브러리를 목록의 맨 아래에서 맨 위로 이동해야했는데 효과가있었습니다.


한 가지 도구를 알려주십시오 : 교체 내 프로젝트 매니페스트의 응용 프로그램 태그 안에 또는 내 라이브러리의 응용 프로그램 태그 안에 이것을 추가해야합니까? 실제로 도움이 될 것입니다.
Sudhanshu Gaur

@SudhanshuGaur 프로젝트의 AndroidManifest.xml 파일에 추가하기 만하면됩니다.
Kyle Liu

74
효과가있었습니다. 그러나 그러한 해결책은 인류로부터 믿음을 이끌어 낼 수 있습니다.
Vinay Patil

8
#android 이런 것들이 안드로이드 개발을 꽤 귀찮게합니다
Taylor Halliday

1
play 및 non play와 같은 여러 제품 버전이 있고 종속성이 "playReleaseCompile ______"인 경우 명령문을 맨 위로 이동해도 작동하지 않을 수 있습니다. 명령문을 "compile ______"로 변경 한 다음 이동해야합니다. 상단. 그때 작동해야합니다.
Soham

33

방금 tools:replace=...OP에서 설명한 것과 동일한 동작을 경험했습니다 .

tools:replace매니페스트 합병에 의해 무시되는 근본 원인 은 여기에 설명 된 버그 인 것으로 나타났습니다 . 기본적으로 속성이 <application ...>포함 된 노드 가있는 매니페스트가 포함 된 라이브러리가 프로젝트 에 있으면 기본 모듈의 매니페스트에 tools:ignore=...있는 tools:replace=...속성이 무시 될 수 있습니다.

여기에 까다로운 점은 것입니다 일 만에 없습니다. 필자의 경우 두 개의 라이브러리, tools:ignore=...속성 이있는 라이브러리 A , 각각의 매니페스트에서 대체 할 속성이있는 라이브러리 B 및 tools:replace=...기본 모듈의 매니페스트에있는 속성이 있습니다. B의 매니페스트가 A의 매니페스트 전에 주 매니페스트에 병합되면 모든 것이 예상대로 작동했습니다. 반대 순서로 오류가 나타납니다.

이러한 병합 순서는 다소 임의적 인 것으로 보입니다. 필자의 경우 dependencies 섹션에서 순서를 변경해 build.gradle도 아무런 효과가 없었지만 맛의 이름을 변경하면 효과가있었습니다.

따라서 신뢰할 수있는 유일한 해결 방법은 라이브러리를 유발하는 문제의 포장을 풀고 tools:ignore=...(보풀 전용 힌트이므로 문제가되지 않아야 함) 라이브러리를 다시 포장하는 것입니다.

그리고 원인이 수정 된 버그에 투표하십시오.


라이브러리 중 하나에서하지, 내 프로젝트에서 무시 : 내 경우에는 내가 도구를 제거했다
mohax

3
이것은 또한 내 문제였습니다. 도구를 <manifest>노드에서 노드로 무시하고 이동 <application>했습니다.
Jacob Tabak


18

나를위한 최종 작업 솔루션 (샘플 코드의 태그 강조 표시) :

  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 ...>에서 코드를 정확히 어떻게 공유 할 수 있습니까?
partizan

8

매니페스트 애플리케이션 태그에서이를 대체 할 수 있습니다.

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

당신을 위해 일할 것입니다.


어떤 이유로 작동하지 않습니다 .... tools:replace="android:label"응용 프로그램 에 추가하려고 하지만 작동하지 않습니다
iKK

4

수정 된 오류로 인해 정확한 오류가 발생했습니다. 다음 도구를 추가하십시오.

매니페스트 의 애플리케이션 태그에 제대로 작동합니다.


정상적인 것입니다. 어떤 주제 : 도구 : 교체가 추가 될 때 정상적인 동작이 발생하지 않는 경우가 있습니다.
David

4

매니페스트 application태그에 있는 것을 교체 할 수 있습니다 .

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

당신을 위해 일할 것입니다.

설명

gradle매니페스트의 응용 프로그램 태그에 해당 레이블이있는 파일 에서 이러한 종속성 / 라이브러리를 사용하면 이 문제가 발생하고이를 대체하는 Manifest것이 해결책입니다.


1

다음과 같은 핵이 작동합니다.

  1. xmlns:tools="http://schemas.android.com/tools"매니페스트 태그에 줄을 추가하십시오
  2. tools:replace="android:icon,android:theme,android:allowBackup,label" 응용 프로그램 태그에 추가

1

내 문제는 기본 모듈, 앱 모듈 및 기능 모듈이있는 다중 모듈 프로젝트입니다. 각 모듈에는 자체 AndroidManifest가 있으며 디버그 및 기본 용 빌드 변형을 구현했습니다. 따라서 "android : name"은 디버그 및 main의 Manifest에만 선언되어 있고 자식 모듈의 Manifest에는 설정되어 있지 않아야합니다. 예 : 메인 매니페스트 :

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

디버그 매니페스트 :

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

다음과 같이 다른 매니페스트 파일에서 "android : name"을 설정하지 마십시오.

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