Слияние Android манифеста завершается после добавления Dependency com.google.android.material

Мы хотели бы использовать самые современные элементы дизайна материалов, представленные Google. Поэтому я добавил com.google.android.material:material:1.0.0-beta01 в нашем проекте gradle file. Но с тех пор я получаю следующую ошибку.

Ошибка манифестного слияния: приложение атрибута @appComponentFactory value = (androidx.core.app.CoreComponentFactory) из [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). Предложение: добавьте инструменты: replace = "android: appComponentFactory" в элемент AndroidManifest.xml: 5: 5-40: 19 для переопределения.

Без материальной библиотеки все работает нормально.

Что я уже пробовал

  1. Я изменил порядок зависимостей (которые явно не работали)
  2. Я также попытался добавить tools:replace="android:appComponentFactory" в наш файл манифеста, как это предлагается в сообщении об ошибке. Но это оставило меня с новым сообщением об ошибке:

java.lang.RuntimeException: сбой манифестового слияния с несколькими ошибками, см. журналы в com.android.builder.core.AndroidBuilder.mergeManifestsForApplication(AndroidBuilder.java:524) в com.android.build.gradle.tasks.ProcessManifest.doFullTaskAction(ProcessManifest.java: 75) at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:106)

Я проверил файл журнала, но единственное предупреждение, показанное в файле idea.log

2018-08-08 11: 08: 21,500 [thread 267] WARN -.tools.idea.model.ManifestInfo - getMergedManifest не удалось Манифест слияния с несколькими ошибками, см. Журналы 2018-08-08 11: 08: 21,642 [thread 267] WARN -.tools.idea.model.ManifestInfo - сбой getMergedManifest Ошибка слияния манифеста с несколькими ошибками, см. Журналы 2018-08-08 11: 08: 21,917 [J pool 0/7]

Больше информации

Версия API

android {
compileSdkVersion 28
buildToolsVersion '28.0.0'

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

(тот же API выбран в файле> структура проекта в Android Studio)

зависимости:

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>

Любая идея, как я могу решить эту проблему?

Ответы

Ответ 1

Основная проблема здесь в том, что вы добавляете

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

он принадлежит недавно выпущенному пакету androidx и в настоящее время не совместим с библиотекой поддержки android, которая у вас есть в ваших зависимостях.

У вас есть 2 варианта:

  1. Замените com.google.android.material: материал: 1.0.0-beta01 на com.android.support:design:28.0.0-beta01 (см. Все библиотеки поддержки https://developer.android.com/topic/libraries/support -библиотека/пакеты) (что я рекомендую)
  2. Использовать опцию Android Studio Refactor для 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>

Ответ 2

Не забудьте добавить

android.useAndroidX=true
android.enableJetifier=true

к вашим gradle.properties. Я всегда забываю это, когда попадаю на новую машину, потому что gradle.properties не находится под контролем исходного кода. Было бы здорово, если бы мы получили разумную ошибку в этом случае.

Ответ 3

У меня тоже есть эта проблема. Когда использовать эту библиотеку в зависимостях

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

Дайте это:

Ошибка слияния манифеста: Атрибут application @appComponentFactory value = (androidx.core.app.CoreComponentFactory) из [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). Предложение: добавьте 'tools: replace = "android: appComponentFactory"' к элементу на AndroidManifest.xml: 5: 5-40: 19, чтобы переопределить.

У меня эта проблема при переходе на AndroidX

Переход к Refactor-> Миграция на AndoridX (на панели инструментов Android Studio 3.2 и выше)

И мою проблему решить

refrence

Ответ 4

Проблема в том, что пакеты AndroidX несовместимы с пакетами поддержки AppCompat. Вам нужно будет выбрать один тип или другой. AndroidX является более новым и предназначен для упрощения работы с совместимостью различных версий Android. У Google есть руководство по миграции на AndroidX от AppCompat.

Путь обновления довольно прост, но немного обременителен, но я бы рекомендовал сделать это, чтобы оставаться в курсе, а не переходить на более раннюю версию пакета разработки.

Обновление для использования AndroidX

Вы можете указать, что хотите использовать AndroidX, добавив в файл gradle.properties:

android.useAndroidX=true
android.enableJetifier=true

Я обнаружил, что мне нужно также добавить следующее в мой файл app/build.gradle чтобы обойти исключение. Default interface methods are only supported starting with Android N (--min-api 24), вероятно, связанного с одним из более новых пакетов:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

Затем вам нужно изменить все ваши пакеты AppCompat в app/build.gradle чтобы использовать соответствующий пакет AndroidX. Вы можете увидеть список в разделе сопоставлений артефактов вышеупомянутой документации, который предоставит сопоставления AppCompat для AndroidX для всех пакетов.

Например, ниже приведены те же пакеты, поэтому вы должны убедиться, что вы используете версию AndroidX вместо версии AppCompat:

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 Studio имеется некоторая автоматизация, которая поможет вам выполнить миграцию, доступную в меню: Refactor> Migrate to AndroidX.

Ответ 5

В последнее время Google хочет отделить зависимость. Они переименовывают пакеты и предлагают использовать androidx с этого момента. Так что последняя версия Google Gradle все под AndroidX.

Для этого вам нужно перенести ваше компактное приложение для Android на Android. Вам нужно использовать некоторые свойства в файле prgradle.properties:

 android.useAndroidX=true
 android.enableJetifier=true

и вам нужно перенести ваш проект из AppCompact в Androidx, для этого вы можете сделать это с помощью инструментов просто

Переход к Refactor-> Миграция на AndoridX (на панели инструментов Android Studio 3.2 и выше)

После этого вам нужно обновить ваш обычный Gradle до Android Android Gradle, вы найдете его на официальной странице Google, как

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

Из этого списка просто выберите alter androidx gradle и соберите свой проект.

Ответ 6

с помощью Android Stuido 3.4.1 я смог выбрать свой проект, выбрать Refactor на главной панели инструментов, а затем перейти на AndroidX... это заняло несколько минут, а затем была кнопка "Создать", это снова заняло несколько минут и успешно завершено.

Ответ 7

implementation 'com.google.android.material:material:1.0.0' 
to 
implementation 'com.android.support:design:28.0.0' 

заменить

import com.google.android.material.textfield.TextInputLayout; 

с

import android.support.design.widget.TextInputLayout;

в ваших изменениях XML

 <com.google.android.material.textfield.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" />

    </com.google.android.material.textfield.TextInputLayout>
от

до

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

наконец, в AndroidManifest добавьте инструменты android: theme = "@style/anothertheme": replace = "android: appComponentFactory"

 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:name="com.yours.app"
        android:theme="@style/anothertheme"
        tools:replace="android:appComponentFactory"
        android:appComponentFactory="androidx">