web-dev-qa-db-ja.com

マニフェストの統合失敗エラー

現在のプロジェクトの巨大なアプリケーションをAndroid St​​udioとGradleに移行中です。現在、次の問題に悩まされています。

Error:(87, 9) Execution failed for task ':App:processDebugManifest'.
> Manifest merger failed : Attribute [email protected] value=(@string/app_label) from AndroidManifest.xml:87:9
    is also present at Android_APPLICATION:Library:unspecified:9:18 value=(@string/app_name)
    Suggestion: add 'tools:replace="Android:label"' to <application> element at AndroidManifest.xml:82:5 to override

メインAndroidManifest.xmlファイルに次の属性を追加しようとしました。

tools:replace="Android:label, *App Name*"
tools:replace="Android:label, @string/app_label"
tools:replace="Android:label"

これらの属性定義はいずれも機能しません。私は何を間違えていますか?

55
James King

これを試してみてください:

これを<manifest/>に追加します

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

これを<application/>に追加します

tools:node="replace"

this に基づいて、すべての要素をオーバーライドする必要があります。 「優先度の低い宣言を注釈付きの宣言に置き換えます。」

142
Kayvan N

バックグラウンド

マニフェストファイルがマージされるとき、label属性と競合があります。

一般的に、 つのタイプがあります 単一の結果アプリマニフェストにマージする必要があるマニフェストファイルです。ここでは優先順位を示します。

  1. 製品フレーバーとビルドタイプ固有のマニフェストファイル。
  2. アプリケーションのメインマニフェストファイル。
  3. ライブラリマニフェストファイル。

解像度

競合は、次の2つの方法のいずれかで解決できます。

競合するラベルを削除します

ライブラリ(または下位レベル)マニフェストファイルから競合する属性を削除します。

この場合、Android_APPLICATION:Library:unspecified:9:18 value=(@string/app_name)には、メインアプリケーションとは異なる@string/app_name値が定義されています。必要ない場合は削除します。ライブラリファイルのAndroid:label="@string/app_name"ファイルからAndroidManifest.xmlを削除するだけです。

競合の自動解決を許可する属性を追加します

いくつかの特別な属性マーカー (ツールの名前空間内)があり、競合の解決方法に関する特定の決定を表すために使用できます。

この場合、メインアプリのAndroid:labelで他の(たとえば、ライブラリファイル)アプリケーションラベルを明示的にオーバーライドするには、xmlns:tools="http://schemas.Android.com/tools"定義を<manifest>ノードに追加し、tools:replace="label"<application>ノードに。

次に例を示します-メインアプリケーションのAndroidManifest.xmlファイルでこれを使用します。

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.mycompany.myapp"
    xmlns:tools="http://schemas.Android.com/tools">

    <application
        Android:label="@string/app_name"
        tools:replace="label"/>
</manifest>

このアプローチは、他の競合する属性でも機能します。たとえば、icon属性も競合している場合、tools:replace="label, icon"に変更できます。

33
CJBS

あなたが幸運だったなら、私と同じように、ハッキングの回避策で問題を手動で修正できます。

AARファイルは、拡張子が.aarの単なる.Zipファイルです。私の場合、.aarを解凍し、問題のあるAndroid:labelをライブラリのAndroidManifest.xmlから削除し、残りのファイルを.aar拡張子で再アーカイブしました。すべてが新しい.aarで完全に機能するようです。

参考までに、 これはAndroid gradleプラグインの既知のバグのようです

4
dm78

同じ問題を修正しました。私のためのソリューション:

  1. xmlns:tools="http://schemas.Android.com/tools"行をマニフェストタグに追加します
  2. マニフェストタグにtools:replace=..を追加します
  3. マニフェストタグでAndroid:label=...を移動します

ここの例

3
stefan K

私も同じ問題に直面していました、そして多くの研究の後に魂が見つかりました

  1. 最小SDKバージョンは、使用しているモジュールのバージョンと同じである必要があります。たとえば、モジュールの最小SDKバージョンは14で、アプリの最小SDKバージョンは9です。同じである必要があります。
  2. アプリとモジュールのビルドバージョンが異なる場合。繰り返しますが、同じはずです

要するに、アプリのbuild.gradleファイルとマニフェストには同じ構成が必要です

  1. マニフェストファイルに2回追加された同じアクセス許可のような重複はありません。同じアクティビティに2回言及されています
  2. プロジェクトからアクティビティを削除した場合は、マニフェストファイルからも削除します
  3. マニフェストファイルのラベル、アイコンなどのタグの理由a)マニフェストタグにxmlns:tools行を追加b)アプリケーションタグにtools:replace =またはtools:ignore =を追加
   <manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.slinfy.ikharelimiteduk"
xmlns:tools="http://schemas.Android.com/tools"
Android:versionCode="1"
Android:versionName="1.0" >
<application
    tools:replace="icon, label"
    Android:label="myApp"
    Android:name="com.example.MyApplication"
    Android:allowBackup="true"
    Android:hardwareAccelerated="false"
    Android:icon="@drawable/ic_launcher"
    Android:theme="@style/Theme.AppCompat" >
</application>
</manifest>

これらの点を考慮することで、このマニフェストのマージに失敗した問題を取り除くことができます。私の投稿を確認してください。あなたは私の投稿を確認できます https://wordpress.com/post/dhingrakimmi.wordpress.com/2

0
Kimmi Dhingra

私はちょうど削除しました

Android:label="@string/app_name

manifest fileから、それはうまくいきました!

0
itzo