Android Material和Appcompat Manifest合并失败


223

我下一年级

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.google.android.material:material:1.0.0-rc01'
}

但是当我要构建应用程序时,我会收到下一条日志:

Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0-alpha3] AndroidManifest.xml:22:18-91
    is also present at [androidx.core:core:1.0.0-alpha3] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory).
    Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml:5:5-19:19 to override.

哎呀!进行清单并执行以下操作:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="ru.chopcode.myapplication">

    <application
        tools:replace="android:appComponentFactory"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
    </application>

</manifest>

然后我在Logcat中收到此错误:

Manifest merger failed with multiple errors, see logs that I have Linked with it

2
尝试删除以下行:实现'com.android.support:appcompat-v7:28.0.0-rc01'和实现'com.android.support.constraint:constraint-layout:
1.1.2'– vcapra1

2
我认为材料包都捆绑在android设计中,请查看...
Marcos Vasconcelos

我需要这个:material.io/design/components/app-bars-bottom.html。这是进入a​​ndroid设计吗?
ЕвгенийУсов

您也可以检查这一点:stackoverflow.com/a/54825603/1318946
Pratik Butani,

新的android studio具有将您的应用程序平稳迁移到androidX的功能。请点击以下链接。 github.com/material-components/material-components-android/...
拉维Jaggarapu

Answers:


15

只需将依赖项的第一行和最后一行中的“ rc01”更改为“ alpha1”,这对我有用


使用操作系统独立路径'META-INF / androidx.core_core.version找到了多个文件
Aliton Oliveira,

40
我没有在实现“ com.android.support:appcompat-v7:28.0.0”中编写“ rc01”。仍然有问题。请提出一些解决方案。
avani kothari

10
这个答案应该是对该问题的评论。
Ananth

459

我有类似的问题。在gradle.properties文件中添加了两行:

android.useAndroidX=true
android.enableJetifier=true

这两行自动解决了我在Google文件与第三方依赖项之间的依赖项冲突。下面就来跟随链接:https://developer.android.com/topic/libraries/support-library/androidx-overview#new-project


6
android.useAndroidX = true
Frank Fang

6
添加后,将发生以下错误```*出了什么问题:任务':react-native-camera:compileGeneralDebugJavaWithJavac'的执行失败。>编译失败;有关详细信息,请参见编译器错误输出。*尝试:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行,以获取更多日志输出。与--scan一起运行以获取完整的见解。```
Dileepa Chandima

@PrinceHamza检查,我们找到了这个github.com/facebook/react-native/issues/…
Dileepa Chandima

9
这应该是公认的答案。这样就解决了问题。
VishalKale

2
“但是我看不到'gradles.properties文件'”。是的,因此在Studio项目中应用程序的根文件夹中,创建该文件(无扩展名)并添加这些行。
user1010160

145

当我尝试将Kotlin-KTX库添加到我的项目时,我遇到了同样的错误。

我尝试向AndroidX迁移,并且问题已解决!

重构/迁移到AndroidX


1
这可行,但是它生成的某些import语句使用了过时的程序包名称。我只能使用androidx.*IDE建议的任何软件包名称来修复其中的一些问题。
安德鲁·科斯特

1
@Mete这个答案救了我的命。我可以给你买啤酒吗?
girish_vr

@girish_vr感谢您的报价:)我很高兴它的工作,这足以让我微笑。
丈量

我遇到了这个问题,因为我在build.gradle文件中提取了最新版本的“ support-v4”库,这不是一个好习惯。如果我在gradle文件中引用了特定版本的库,那么我永远不会遇到这个问题。此外,在进行了更多研究之后,我可以看到Google建议使用AndroidX库。所以,我决定硬着头皮。幸运的是,升级后所有问题都得以解决...避免了灾难,有关gradle引用的经验教训。
BluJ IT

104

失败原因

您正在使用的材质库是AndroidX的一部分。如果您不了解AndroidX,请执行以下回答

一个应用程序应使用AndroidX或旧的Android支持库。这就是为什么您遇到此问题。

例如 -

在您的gradle中,您正在使用

  • com.android.support:appcompat-v7 (旧的--Android支持库的一部分)
  • com.google.android.material:material(AndroidX的一部分)(的AndroidX构建工件com.android.support:design

因此,解决方案是使用AndroidX或旧的支持库。我建议使用AndroidX,因为Android在28.0.0版之后将不更新支持库。请参阅支持库的发行说明

只需迁移到AndroidX。是我迁移到AndroidX的详细答案。我在这里把答案中需要采取的步骤。

迁移之前,强烈建议您备份项目。

现有项目

  • Android Studio>重构菜单>迁移到AndroidX ...
  • 它将分析并在底部打开“折射器”窗口。接受要完成的更改。

图片

新项目

将这些标志放在您的 gradle.properties

android.enableJetifier=true
android.useAndroidX=true

检查@ Library映射是否有相等的AndroidX软件包

检查@ 迁移到AndroidX的官方页面

什么是Jetifier?


之后仍然有错误,但是此答案有所帮助:stackoverflow.com/a/49525685/1972372
Big_Chair

3
请记住单击“迁移到AndroidX”后单击左下方的“执行重构”
SupaHam 19'Aug

88

就我而言,这是完美的工作..我在清单文件中添加了以下两行代码

tools:replace="android:appComponentFactory"
android:appComponentFactory="whateverString"

幸得这个答案

清单文件示例


4
我不知道以后我的应用程序是否会出现问题,但它确实有效!
Aliton Oliveira

4
是的,我有一个问题:使用操作系统独立路径'META-INF / androidx.core_core.version找到了多个文件
Aliton Oliveira,

3
然后我得到一个错误,指出工具未绑定到应用程序标签。
特拉维斯·戴利

您可以发布完整日志吗?
Muhaiminur Ra​​hman


29

简单的解决方案-迁移到AndroidX

在中gradle.properties,只需在下面添加两个脚本

android.useAndroidX=true
android.enableJetifier=true

是什么原因↓

AndroidX中的所有包都以字符串androidx开头,位于一致的命名空间中。支持库包已映射到相应的androidx。*包中。有关所有旧类和构建工件到新工件的完整映射,请参见“包重构”页面。

请参阅“软件包重构”页面


我的项目中没有这样的文件gradle.properties。(它最初是在几年前的eclipse中创建的,后来移到android studio中)
Sujith Manjavana '19

哦...我没有遇到这样的情况,我发现下面的线索,可以帮助你 stackoverflow.com/a/37389861/6917362 试着做评论请
EJ Chathuranga

只需在main build.gradle附近创建该文件(如果该文件不存在)并同步项目。
Fedir Tsapana

13

只需删除android.support的依赖关系

    implementation 'com.android.support:appcompat-v7:28.0.0-rc01'

引用材料指南

如果您还不想切换到新的androidx和com.google.android.material软件包,则可以通过com.android.support:design:28.0.0-alpha3依赖项来使用Material Components。

注意:请勿同时在应用程序中使用com.android.support和com.google.android.dependencies。

只需删除此依赖项就可以了

    implementation 'com.android.support:appcompat-v7:28.0.0-rc01'

这是完整的依赖示例

    dependencies {
       implementation fileTree(dir: 'libs', include: ['*.jar'])
       implementation 'com.google.android.material:material:1.0.0-beta01'
       implementation 'com.android.support.constraint:constraint-layout:1.1.2'
       testImplementation 'junit:junit:4.12'
       androidTestImplementation 'com.android.support.test:runner:1.0.2'
       androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
   }

1
这是最准确的答案。
弗朗·马佐亚

1
@FranMarzoa不是。从另一个依赖项导入compat库时会发生什么?
m0skit0

1
@ m0skit0,您必须在这里发布一个不同的问题,我想...;)
Fran Marzoa


12

在您的Android AndroidManifest.xml中查看此图像并添加此行

tools:replace="android:appComponentFactory"
android:appComponentFactory="whateverString"

在此处输入图片说明


字符串是什么意思?
Kishore Kumar,

@KishoreKumar您还可以添加任何字符串名称,例如appName。
Prashant Arvind

确切地说,whatthString应该是扩展AppComponentFactory的完整类名。例如,自定义定义的类com.xxx.MyFactory扩展了AppComponentFactory
jiashie

11

将这些行添加到AndroidManifest.xml文件中。

tools:replace="android:appComponentFactory"

android:appComponentFactory="whateverString"

1
添加时工具会变成红色。还有其他需要添加的东西吗?
natsumiyu

没有什么可添加的了。原因之一可能是您的gradle版本不匹配。您可以显示您的AndroidManifest.xml文件代码吗?
阿贾伊,

我尝试了迁移到androidx,并且任务':app:compileDebugJavaWithJavac'的执行失败。>编译失败;有关详细信息,请参见编译器错误输出。
natsumiyu

这是我的Android清单<application android:allowBackup =“ true” android:icon =“ @ mipmap / ic_launcher” android:label =“ @ string / app_name” android:roundIcon =“ @ mipmap / ic_launcher” android:usesCleartextTraffic =“ true “ android:supportsRtl =” true“ android:theme =” @ style / AppTheme“工具:replace =” android:appComponentFactory“ android:appComponentFactory =” @ string / texthere“>
natsumiyu

1
很好的解决方案,节省了我的时间。
Umair Iqbal,


8

跟着这些步骤:

  • 转到“重构”,然后单击“迁移到AndroidX”
  • 单击执行重构

这不会完成整个重构:(
Mohsin


6

此问题主要发生在旧的依赖项上

有两种解决方案:

第一:

从文件更新all old dependenciesClassPathsProject level gradle

classpath 'com.android.tools.build:gradle:3.3.1'
classpath 'com.google.gms:google-services:4.2.0'

第二个:

您的专案 Migrate to AndroidX

从Android Studio菜单-> Refanctor-> Migrate to AndroidX

谢谢,让我知道是否有人可以从此答案中获得帮助。


6

最后,通过在android/build.gradle文件中添加两行找到了一种快速简便的解决方案。

googlePlayServicesVersion = "16.+"

firebaseVersion = "17.6.0"

请遵循此100%正确的规定。


1
哪里还要添加​​?
特拉维斯·戴利

在android系统/文件的build.gradle收藏此
马诺Alwis

2
@ManojAlwis我们需要在build.gradle文件的哪个部分放置它?
Keval Langalia

@KevalLangalia,只需将这两行添加到android-> build.gradle file中。例如:buildscript {ext {buildToolsVersion =“ 28.0.3” minSdkVersion = 19 compileSdkVersion = 28 targetSdkVersion = 28 supportLibVersion =“ 28.0.0” googlePlayServicesVersion =“ 16. +” firebaseVersion =“ 17.3.4”}
Manoj Alwis

1
真的很有帮助...谢谢
Vasudev Vyas

6

所有关于库版本兼容性的信息

我两个小时就遇到了这个奇怪的错误。我通过执行以下步骤解决了该错误

将您的build.gradle依赖项挂起

  implementation 'com.google.android.gms:play-services-maps:17.0.0'

  implementation 'com.google.android.gms:play-services-maps:15.0.0'

1
老实说,我做了同样的事情,并且奏效了,所以我想所有关于合并过程后库版本兼容性的问题
Milos

6

仅当您不想使用androidx时

因此,就我而言,我使用的是使用androidx的库,但我没有使用androidx,因此当我将该库版本降级时,问题已解决。

就我而言:

implementation 'com.github.turing-tech:MaterialScrollBar:13.+'

上述库导致问题13. +将使用androidx自动获取该库的新版本。所以我将库版本降级为:

implementation 'com.github.turing-tech:MaterialScrollBar:13.2.5'

问题解决了。


6
  1. 请转到重构->迁移->迁移到AndroidX。

  2. 请将其添加到您的gradle.properties文件中:

    android.enableJetifier=true
    android.useAndroidX=true

并执行同步。


请您解释一下,您现在的情况如何?
Girish BR

我继承的项目已有五年的历史了。我尝试实施Google推动的新的Fabric / Firebase分析。该新库正在使用androidx兼容性库,而我的项目使用AppCompat。现在,我不得不处理大量的依赖更新和相关内容。我停下来,然后尝试了各种操作,包括这些命令,由于有新的Firebase东西,所以我需要它们。打开此选项后,出现了很多编译器错误。修复了该问题,但是现在我有来自ui xml文件的错误。因此,我将不得不放弃所有内容,并尝试使用旧版本。
Martin Berger

经过一小时的手动将类名称空间修复为androidx之后,它现在似乎可以工作了。麻烦的是,编译器无法在xml中检测到例如:“ android.support.v7.widget.AppCompatSpinner”需要为“ androidx.appcompat.widget.AppCompatSpinner”。该文档派上用场了:developer.android.com/jetpack/androidx/migrate
马丁·伯杰

希望它现在能正常工作,如果有任何问题请通知我。我们将继续努力!
Girish BR

4

创建新项目并比较您的build.gradle文件并替换所有

implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.1'

和其他依赖项与在新项目中一样

implementation 'androidx.appcompat:appcompat:1.0.0-alpha3'

implementation 'androidx.constraintlayout:constraintlayout:1.1.2'

implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0-alpha1'

androidTestImplementation 'androidx.test:runner:1.1.0-alpha3'

androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha3'

implementation 'androidx.core:core-ktx:1.0.0-alpha3'

然后修复导入以在kotlin文件中使用androidx。


由于某种原因,我不想使用androidx。
shaby

4

我所做的就是转到顶部菜单上的“重构”选项。

然后选择“迁移到AndroidX”

接受以将项目另存为zip文件。

请更新Android Studio和Gradle,以确保不会遇到任何问题。


4

1.将以下代码添加到您的app / build.gradle的末尾:

configurations.all {
   resolutionStrategy.force 'com.android.support:support-v4:28.0.0' 
   // the above lib may be old dependencies version       
    }

2.将SDK和工具版本修改为28:

compileSdkVersion 28
buildToolsVersion '28.0.3'
targetSdkVersion  28

3.在您的AndroidManifest.xml文件中,应添加两行:

<application
    android:name=".YourApplication"
    android:appComponentFactory="AnyStrings"
    tools:replace="android:appComponentFactory"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar">

或简单地

  • 转到重构(Studio->菜单->重构)
  • 点击迁移到AndroidX。它正在工作
  • 它正在工作。

2
  • 转到重构(图片
  • 点击迁移到AndroidX。它正在工作
  • 它正在工作。

1
欢迎使用指向解决方案的链接,但请确保没有该链接的情况下,您的回答是有用的:在链接周围添加上下文,以便您的其他用户可以了解它的含义和含义,然后引用您所使用页面中最相关的部分如果目标页面不可用,请重新链接到。只是链接的答案可能会被删除。
马修

2

如果您不打算迁移到AndroidX,请执行以下步骤

  1. 在终端类型gradlew应用程序中:依赖项
  2. 在窗口中显示依赖项后,按Ctrl + f并键入androidX
  3. 您会发现内部正在使用androidx lib的所有依赖项,您可能必须降级或使用替代项以确保它不再在内部使用androidX libs。

1

我有同样的问题三天了。

就像android希望我们使用Kotlin或AndroidX一样,他们正在淘汰Android。

但这就是我解决的方法。

  • 我将项目迁移到AndroidX。这不会带来与此问题相关的任何错误,它会分别更新文件。在您的应用程序中无需更改方法,类或变量名。

注意:您必须在最新的稳定版android studio 3.4.1中使用最新的库(build.grudle文件)


1

我不知道这是否是正确的答案,但对我有用

增加网格包装属性

distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

并建立网格到

    classpath 'com.android.tools.build:gradle:3.4.2'

由于版本而显示错误。


我认为该字符串应为androidx.core.app.AppComponentFactory,任意字符串有时会导致随机错误。,
seyedrezafar

0

首先,请务必在清单标记中添加此行

xmlns:tools="https://schemas.android.com/tools"

然后添加工具,在Android Studio中替换您建议的工具


0

将build.gradle(模块:app)中的proguardFile更改为以下内容

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

代替

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

这对我有用


0

为了解决这个问题,我建议android/build.gradle您在根项目中明确定义ext变量的版本

ext {
    googlePlayServicesVersion = "16.1.0" // default: "+"
    firebaseVersion = "15.0.2" // default: "+"

    // Other settings
    compileSdkVersion = <Your compile SDK version> // default: 23
    buildToolsVersion = "<Your build tools version>" // default: "23.0.1"
    targetSdkVersion = <Your target SDK version> // default: 23
    supportLibVersion = "<Your support lib version>" // default: 23.1.1
}

参考 https://github.com/zo0r/react-native-push-notification/issues/1109#issuecomment-506414941


0

我也面临着同样的问题,对于您的android studio,您只需更改android Gradle插件版本3.3.2,而Gradle版本是5.1.1


0

就我而言,我要添加清单文件

tools:replace="android:appComponentFactory"
android:appComponentFactory="whateverString"

应用标签,当然可以

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.