ツール: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/…。これを一度行っても特に害はありませんが、定期的に練習するのは良くありません。
スコットバルタ2014

1
<application>プロジェクトでタグが繰り返されていると思います。Plsは1つだけであることを確認し<application>ます。
パンサー

特に任意の数のライブラリサブモジュールを使用する場合、プロジェクトには多くの<application>タグが存在する可能性があります。
agrosner 2014

これが問題なく動作する例の例があります。使用しているAndroidビルドツールのバージョンを教えてください。
G.ブレイクメイケ2014年

マニフェストタグに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単にメタデータタグ全体をtools:node="replace"<meta-data tools:node="replace" android:name="QUERY_LOG" android:value="true" />などに置き換えます
Blacklight

25
よくわかりません。それはまさに彼が彼の質問でやっていることではありませんか?
Jason Robinson

tools:replace置き換える必要のあるソースではなく、それを置き換える必要があるアプリケーションタグに追加しました。したがって、私のアプリマニフェストは、ライブラリで定義されているものを置き換えます。「交換できるもの」の代わりに「交換すべきもの」と言います。質問が片付けられることを願っています。
WarrenFaith 2015年

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.ソコル

1
私は私のために働きませんでした、tools:replace = "android:allowBackup、android:label"だけでなく、tools:replace = "allowBackup、label"だけを置くべきです。
jmarkstar

1
これは機能していますか?私にとって、allowBackupを間違った場所に書いているように見え、マージ後、ライブラリがマニフェストで指定したものが優先されるためです。上に移動した後に競合が発生することはありません。間違っているためです(developer.android.com/guide/topics/manifest/…)AllowBackupはApplication要素に属しています。
2017

2
[...上から続く]これは機能しません。あなたはallowBackupを間違った場所に書いており、マージ後、ライブラリがマニフェストで指定したものが優先されます。上に移動した後に競合が発生することはありません。間違っているためです(developer.android.com/guide/topics/manifest/…)AllowBackupはApplication要素に属しています。APKを逆コンパイルしてテストしましたが、最終的なマニフェストの値は、私が指定した
とおり

38

Gradleファイルで依存関係を並べ替えてみてください。問題のライブラリをリストの一番下から一番上に移動する必要があり、それが機能しました。


ツールを1つ教えてください:プロジェクトマニフェストの内部アプリケーションタグまたはライブラリの内部アプリケーションタグを追加する必要がありますを置き換えてください。本当に役立つと思いますか?
Sudhanshu Gaur

@SudhanshuGaurこれをプロジェクトのAndroidManifest.xmlファイルに追加するだけです。
Kyle Liu

74
出来た。しかし、そのような解決策は人類からの信仰を取り除くかもしれません。
Vinay Patil 2016年

8
このような#androidの落とし穴は、Android向けの開発をかなり面倒です
Taylor Halliday

1
playとnon playのような複数の製品フレーバーがあり、依存関係が「playReleaseCompile ______」である場合、ステートメントを先頭に移動するだけでは機能しない可能性があり、ステートメントを「compile ______」に変更してから、上。それならうまくいくはずです。
Soham 2016

33

私は同じ行動を経験しました tools:replace=...OP。

tools:replaceマニフェストマージによって無視される根本的な原因は、ここで説明するバグであることが判明しました。基本的に<application ...>tools:ignore=...属性を含むノードを持つマニフェストを含むライブラリがプロジェクトにある場合tools:replace=...、メインモジュールのマニフェストの属性が無視される可能性があります。

ここでのトリッキーなポイントは、発生する可能性があることですが、発生する必要はありません。私の場合、2つのライブラリがあり、ライブラリAにはtools:ignore=...属性があり、ライブラリBにはそれぞれのマニフェストで置き換えられるtools:replace=...属性があり、メインモジュールのマニフェストに属性があります。BのマニフェストがAのマニフェストの前にメインマニフェストにマージされた場合、すべてが期待どおりに機能しました。逆のマージ順序でエラーが発生しました。

これらのマージが行われる順序は、いくぶんランダムであるようです。私の場合、依存関係セクションの順序を変更しbuild.gradleても効果はありませんでしたが、フレーバーの名前を変更すると変更されました。

したがって、唯一の信頼できる回避策は、問題のあるライブラリをアンパックし、tools:ignore=...タグを削除して(lintのヒントにすぎないので問題ないはずです)、ライブラリを再度パックすることです。

そして、バグを修正するために投票してください。


私の場合、ツールを削除する必要がありました。ライブラリからではなく、プロジェクトから無視してください
mohax

3
これも私の問題でした。tools:ignoreを<manifest>ノードから<application>ノードに移動し、機能しました。
Jacob Tabak 2017年

Bazel v2.0.0で同じ問題が発生したばかり
Nick Korostelev

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 ...>でコードを正確に共有できますか?
パルチザン

8

マニフェストアプリケーションタグでこれらを置き換えることができます。

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

そしてあなたのために働くでしょう。


なんらかの理由tools:replace="android:label"で動作しません。アプリケーションに追加しようとしましたが、動作しません
iKK

4

修正済み 正確なエラーがあったので、次のツールを追加してください:replace = "android:icon、android:theme"

マニフェストのアプリケーションタグに入れても問題なく動作します


それは正常なことです。トピックとは、通常の動作ではないことですが、tools:replaceが追加された場合にも発生します。
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」がデバッグのマニフェストとメインのみで宣言されていることを確認し、子モジュールのマニフェストには設定しないでください。例:メインのマニフェスト:

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