【问题标题】:ERROR: Attribute application@name is too present错误:属性 application@name 太存在
【发布时间】:2019-07-10 09:22:59
【问题描述】:

您好,我正在开发 2 个模块 A 和 B,B 依赖于 A。

最后两个有一个Application类,用于静态获取上下文。

并且在两个模块中都有它们的清单。

模块 A 清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="apps.com.a">

    <application android:name=".AA"/>

</manifest>

模块 B 清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="apps.com.b">

    <application
        android:name=".BApp">
    </application>

</manifest>

当我尝试执行 Junit 时,我收到以下错误:

Manifest merger failed : Attribute application@name value=(apps.b.BApp) from [__tested_artifact__::blibrary] AndroidManifest.xml:14:18-72
    is also present at [:alibrary] AndroidManifest.xml:11:18-78 value=(apps.com.a.AApplication).
    Suggestion: add 'tools:replace="android:name"' to <application> element at manifestMerger2718201306699938665.xml:7:5-9:19 to override.

关于如何解决这个问题的任何想法,我会说 'tools:replace="android:name"' 是正确的,还是可能是错误?

【问题讨论】:

    标签: android android-manifest android-module


    【解决方案1】:

    是的,您可以使用tools:replace="android:name" 来解决此问题

    根据docs

    您的 APK 文件只能包含一个 AndroidManifest.xml 文件,但您的 Android Studio 项目可能包含多个——由主要源集、构建变体和导入的库提供。因此,在构建您的应用时,Gradle 构建会将所有清单文件合并到一个清单文件中,然后打包到您的 APK 中。

    清单合并工具通过遵循一些合并启发式方法并遵守您使用特殊 XML 属性定义的合并首选项来合并每个文件中的所有 XML 元素。本页介绍清单合并的工作原理以及如何应用合并首选项来解决合并冲突。


    tools:replace="attr, ..."

    将低优先级清单中的指定属性替换为此清单中的属性。换句话说,始终保持较高优先级清单的值。

    【讨论】:

    • 那么,我应该在 MODULE 清单或 MAIN_APP 清单中使用 tools:replace="android:name" 吗?
    【解决方案2】:

    在 AndroidMainifest.xml 中 添加2行

    android:name=".Application"
    tools:replace="android:name"
    

    【讨论】:

      【解决方案3】:

      我通过添加解决了这个问题

      tools:replace="name"
      

      在清单文件中我的应用程序名称下方

      【讨论】:

        猜你喜欢
        • 2022-07-03
        • 1970-01-01
        • 2022-11-30
        • 2012-01-04
        • 1970-01-01
        • 2019-11-19
        • 2018-07-17
        • 2019-02-08
        • 1970-01-01
        相关资源
        最近更新 更多