web-dev-qa-db-ja.com

Android Dependency com.google.Android.materialを追加した後、マニフェストマージが失敗する

Googleが提示する最新のマテリアルデザインUI要素を使用したいと思います。したがって、プロジェクトgradleファイルにcom.google.Android.material:material:1.0.0-beta01を追加しました。しかし、それ以来、次のエラーが発生します。

マニフェストの統合に失敗しました:属性application @ appComponentFactory value =(androidx.core.app.CoreComponentFactory)from [androidx.core:core:1.0.0-beta01] AndroidManifest.xml:22:18-86も[com.Android .support:support-compat:28.0.0-beta01] AndroidManifest.xml:22:18-91 value =(Android.support.v4.app.CoreComponentFactory)。提案:オーバーライドするには、AndroidManifest.xml:5:5-40:19の要素に「tools:replace = "Android:appComponentFactory"」を追加します。

マテリアルライブラリがなければ、すべて正常に動作します。

私がすでに試したもの

  1. 依存関係の順序を変更しました(明らかに動作しませんでした)
  2. また、エラーメッセージに示されているように、マニフェストファイルにtools:replace="Android:appComponentFactory"を追加しようとしました。しかし、これにより新しいエラーメッセージが残りました。

Java.lang.RuntimeException:マニフェストのマージが複数のエラーで失敗しました。com.Android.build.gradle.tasks.ProcessManifest.doFullTask​​Action(ProcessManifestのcom.Android.builder.core.AndroidBuilder.mergeManifestsForApplication(AndroidBuilder.Java:524)のログを参照してください。 .Java:75)at com.Android.build.gradle.internal.tasks.IncrementalTask​​.taskAction(IncrementalTask​​.Java:106)

ログファイルを確認しましたが、idea.logに表示される警告は

2018-08-08 11:08:21,500 [スレッド267]警告-.tools.idea.model.ManifestInfo-getMergedManifestが失敗しましたマニフェストのマージが複数のエラーで失敗しました。ログを参照してください2018-08-08 11:08:21,642 [スレッド267]警告-.tools.idea.model.ManifestInfo-getMergedManifestが失敗しましたマニフェストのマージが複数のエラーで失敗しました。ログを参照してください2018-08-08 11:08:21,917 [Jプール0/7]

詳細

APIバージョン

Android {
compileSdkVersion 28
buildToolsVersion '28.0.0'

defaultConfig {
    minSdkVersion 19
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
}

(同じAPIがファイルで選択されているAndroid St​​udioのプロジェクト構造)

依存関係:

dependencies {
api fileTree(include: ['*.jar'], dir: 'libs')

/** Android LIBRARIES  **/
implementation 'com.Android.support:multidex:1.0.2'
implementation 'com.Android.support:appcompat-v7:28.0.0-beta01'
api 'com.Android.support:support-v13:28.0.0-beta01'
api 'com.google.Android.material:material:1.0.0-beta01'
api 'com.Android.support:design:28.0.0-beta01'
api 'com.Android.support:preference-v7:28.0.0-beta01'
api 'com.Android.support:cardview-v7:28.0.0-beta01'
api 'com.Android.support:customtabs:28.0.0-beta01'
api 'com.Android.support:support-v4:28.0.0-beta01'

/** GOOGLE PLAY SERVICE  **/
api 'com.google.Android.gms:play-services-auth:15.0.1'

api 'com.google.Android.gms:play-services-drive:15.0.1'
api 'com.google.Android.gms:play-services-fitness:15.0.1'
api 'com.google.Android.gms:play-services-maps:15.0.1'
api 'com.google.Android.gms:play-services-wearable:15.0.1'
api 'com.google.Android.gms:play-services-vision:15.0.2'

api 'com.google.firebase:firebase-core:16.0.1'
api 'com.google.firebase:firebase-perf:16.0.0'
api 'com.crashlytics.sdk.Android:crashlytics:2.9.4'

//sunrise and sundown calculation for map day and night mode
api 'com.luckycatlabs:SunriseSunsetCalculator:1.2'

/** GOOGLE MAPS  **/
implementation 'com.google.maps.Android:android-maps-utils:0.5'
implementation 'com.google.code.gson:gson:2.8.0'

/** EXTERNAL LIBRARIES  **/

implementation 'org.osmdroid:osmdroid-Android:5.6.5'
implementation 'org.osmdroid:osmdroid-mapsforge:5.6.5'
implementation 'org.mapsforge:mapsforge-map-Android:0.6.1'
implementation 'org.mapsforge:mapsforge-map:0.6.1'
implementation 'com.caverock:androidsvg:1.2.2-beta-1'

//dropbox api
implementation 'com.dropbox.core:dropbox-core-sdk:3.0.6'    

androidTestImplementation 'junit:junit:4.12'
implementation files('libs/samsung-health-data-v1.3.0.jar')}

マニフェスト

<manifest
package="com.user.libraries.bluetooth"
xmlns:tools="http://schemas.Android.com/tools"
xmlns:Android="http://schemas.Android.com/apk/res/Android">

<uses-permission Android:name="Android.permission.NFC" />
<uses-permission Android:name="Android.permission.BLUETOOTH" />
<uses-permission Android:name="Android.permission.BLUETOOTH_ADMIN" />
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.BODY_SENSORS" />
<uses-permission Android:name="Android.permission.VIBRATE"/>    

<application
    tools:replace="Android:appComponentFactory"
    Android:allowBackup="true"
    Android:supportsRtl="true">
    <service Android:name="com.user.libraries.location.LocationService" />
    <service Android:name="com.user.libraries.location.BleLocationTrackerService" />
    <service Android:name="com.user.libraries.sensors.SensorService"/>

    <service Android:name="com.user.libraries.sharing.DataExchangerService"/>

    <receiver
        Android:name="com.user.libraries.bluetooth.BluetoothStateReceiver"
        Android:enabled="true">
        <intent-filter>
            <action Android:name="Android.bluetooth.adapter.action.STATE_CHANGED"/>
        </intent-filter>
    </receiver>

    <provider
        Android:name="Android.support.v4.content.FileProvider"
        Android:authorities="${applicationId}.provider"
        Android:exported="false"
        Android:grantUriPermissions="true">
        <meta-data
            Android:name="Android.support.FILE_PROVIDER_PATHS"
            Android:resource="@xml/provider_paths"/>
    </provider>

</application>

この問題を解決する方法はありますか?

15
little_planet

ここでの主な問題は、追加することです

com.google.Android.material:material:1.0.0-beta01

これは新しくリリースされたandroidxパッケージに属し、現在、依存関係にあるAndroidサポートライブラリと互換性がありません。

次の2つのオプションがあります。

  1. com.google.Android.material:material:1.0.0-beta01com.Android.support:design:28.0.0-に置き換えますbeta01(すべてのサポートライブラリを参照 https://developer.Android.com/topic/libraries/support-library/packages )(推奨)
  2. Android St​​udioオプションを使用してAndroidXにリファクタリングします( https://material.io/develop/Android/docs/getting-started/ を参照)(推奨しません)

作業コードのサンプルは次のとおりです。

 <Android.support.design.widget.TextInputLayout
        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:layout_weight="1"
        app:boxStrokeColor="@color/colorAccent"
        app:boxStrokeWidth="5dp">

        <Android.support.design.widget.TextInputEditText
            Android:id="@+id/messageEditText"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content" />

 </Android.support.design.widget.TextInputLayout>
6
redlabrat

追加することを忘れないでください

Android.useAndroidX=true
Android.enableJetifier=true

gradle.propertiesに。 gradle.propertiesがソース管理にないため、新しいマシンを使用するときにこれを常に忘れています。この場合に理にかなったエラーが発生したら素晴らしいでしょう。

7
Daniel Wilson

私にもこの問題があります。このライブラリを依存関係で使用する場合

implementation 'com.google.Android.material:material:1.0.0'

これを与える:

マニフェストのマージに失敗しました:属性application @ appComponentFactory value =(androidx.core.app.CoreComponentFactory)from [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86も[com.Android.supportにあります:support-compat:28.0.0] AndroidManifest.xml:22:18-91 value =(Android.support.v4.app.CoreComponentFactory)。提案:オーバーライドするには、AndroidManifest.xml:5:5-40:19の要素に「tools:replace = "Android:appComponentFactory"」を追加します。

AndroidXに切り替えるとこの問題が発生します

リファクタリング-> AndoridXへの移行(Android studio 3.2以降のツールバー)

そして私の問題は解決します

参照

1
Radesh

問題は、AndroidXパッケージがAppCompatサポートパッケージと互換性がないことです。いずれかのタイプを選択する必要があります。 AndroidXはより新しく、さまざまなAndroidバージョンの互換性を簡単に操作できるように設計されています。 Googleには AppCompatからAndroidXへの移行 に関するガイドがあります。

アップグレードパスはかなり簡単ですが、少し面倒ですが、古いデザインパッケージにダウングレードするのではなく、最新の状態に保つためにそれを行うことをお勧めします。

AndroidXを使用するためのアップグレード

以下をgradle.propertiesファイルに追加することにより、AndroidXを使用することを指定できます。

Android.useAndroidX=true
Android.enableJetifier=true

おそらく新しいパッケージの1つに関連する例外 Default interface methods are only supported starting with Android N (--min-api 24) を回避するために、以下をapp/build.gradleファイルに追加する必要があることがわかりました。

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

次に、app/build.gradle内のすべてのAppCompatパッケージを変更して、一致するAndroidXパッケージを使用する必要があります。上記のドキュメントの Artifact mappings セクションにリストがあり、すべてのパッケージのAppCompatからAndroidXへのマッピングが提供されます。

たとえば、次のパッケージは同じパッケージなので、AppCompatバージョンではなくAndroidXバージョンを使用していることを確認します。

implementation 'com.Android.support:design' # AppCompat version
implementation 'com.google.Android.material:material:1.1.0-alpha08' # AndroidX version

コンパイルしようとすると、新しいパッケージを使用するためにアクティビティを移行する必要があるため、エラーが発生するはずです。私にとっては、サポートライブラリのバージョンを削除し、AndroidXバージョンに置き換えて、次の変更を行う必要がありました。

# remove
-import Android.support.design.widget.FloatingActionButton
-import Android.support.design.widget.Snackbar
-import Android.support.v4.app.ActivityCompat
-import Android.support.v4.content.ContextCompat
-import Android.support.v7.app.AlertDialog
-import Android.support.v7.app.AppCompatActivity
-import Android.support.v7.widget.Toolbar
# add
+import com.google.Android.material.floatingactionbutton.FloatingActionButton
+import com.google.Android.material.snackbar.Snackbar
+import androidx.appcompat.app.AlertDialog
+import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.widget.Toolbar
+import androidx.core.app.ActivityCompat
+import androidx.core.content.ContextCompat

KotlinおよびJavaファイルでは、これは簡単です(上記のように)が、コンパイラーはレイアウトファイルに関しては役に立たないため、実行時にレイアウトが膨らんだときにレイアウトインフレーション例外がスローされます。また、レイアウトXMLファイルでそれらを変更する必要があります。

-        <Android.support.design.widget.TextInputLayout
+        <com.google.Android.material.textfield.TextInputLayout

このプロセス中に、Gradleをアップグレードするよう求められることがありますが、これは良い考えです。

多少面倒ですが、新しいライブラリがリリースされても使用し続けることができるので、アップグレードパスに価値があると思います。

新しいバージョンのAndroid St​​udioには、移行を支援するためのいくつかの自動化があり、メニューで利用できます:リファクタリング> AndroidXへの移行

0
Tina

最近、Googleは依存関係を分離したいと考えています。パッケージの名前を変更し、今からandroidxを使用することを提案します。そのため、最新のgoogle gradleバージョンはすべてandroidxの下にあります。

このためには、プロジェクトAndroid app compactをandroidxに移行する必要があります。 prgradle.propertiesファイルにいくつかのプロパティを使用する必要があります。

 Android.useAndroidX=true
 Android.enableJetifier=true

プロジェクトをAppCompactからAndroidxに移行する必要があります。ツールを使用してそれを行うことができます

リファクタリング-> AndoridXへの移行(Android studio 3.2以降のツールバー)

その後、通常のgradleをandroidx gradleにアップグレードする必要があります

https://developer.Android.com/jetpack/androidx/migrate

このリストから、alter androidx gradleを選択し、プロジェクトをビルドするだけで問題ありません。

0
pavel

Android stuido 3.4.1を使用して、プロジェクトを選択し、メインツールバーから[リファクタリング]を選択して、AndroidXに移行しました。再びしばらく時間がかかり、正常に完了しました。

0
Roddy Morrison