【问题标题】:Gradle merge wrapper/sub-module's Android manifest into a main module's manifestGradle 将包装器/子模块的 Android 清单合并到主模块的清单中
【发布时间】:2014-02-09 23:13:32
【问题描述】:

我的项目中有以下模块,我无法让 Gradle 正确合并 Android 清单:

myproject_alpha
myproject_beta
myproject_lib
myproject_release

*_lib 模块是包含所有源代码的项目的主模块。其他 3 个模块是“包装模块”,它们对内容提供者的“权限”参数进行轻微修改,更改 *_lib 模块清单中指定的活动意图过滤器内的“数据”字段,并启用一些其他活动myproject_release 模块。

目前,我在 alpha(或 beta 或发布)与 lib 之间存在 gradle Android manifest 合并错误。例如,在 lib 和 alpha 之间,我看到以下 2 个 gradle 错误:

Trying to merge incompatible /manifest/application/provider[@name=com.myproject.contentprovider.MyProvider] element:
  <provider
--    @android:authorities="com.myproject.alpha.provider"
  <provider
++    @android:authorities="com.myproject.lib.provider"

:myproject_alpha:processDebugManifest FAILED

Trying to merge incompatible /manifest/application/activity[@name=com.myproject.activity.LoginActivity] element:
  <activity
  @android:name="com.myproject.activity.LoginActivity"
          @android:name="android.intent.action.MAIN">
          @android:name="android.intent.category.LAUNCHER">
  <intent-filter>
          @android:name="android.intent.action.VIEW">
          @android:name="android.intent.category.BROWSABLE">
          @android:name="android.intent.category.DEFAULT">
      <data
--            @android:host="myhost.test.com"
  <activity
  @android:name="com.myproject.LoginActivity"
          @android:name="android.intent.action.MAIN">
          @android:name="android.intent.category.LAUNCHER">
  <intent-filter>
          @android:name="android.intent.action.VIEW">
          @android:name="android.intent.category.BROWSABLE">
          @android:name="android.intent.category.DEFAULT">
      <data
++            @android:host="myhost.com"

:myproject_alpha:processDebugManifest FAILED

我发现的唯一类似问题是
Gradle: How to merge Android manifest files for different buildTypes which need the same Activity, but with different intent-filters。但是,它并不真正符合我的问题,因为在我的情况下,“lib”和“alpha”是相互依赖的模块而不是不同的构建。我会很感激一些反馈。

【问题讨论】:

    标签: android-studio android-gradle-plugin


    【解决方案1】:

    我对上面的答案有疑问,因为当我编译时,我总是收到消息

    无效指令“合并”,有效指令为: 删除,替换,严格

    我发现在@swooby 答案中导入工具成功,然后在&lt;activity&gt; 标记中添加tools:node="merge" 为正在启动的活动我想要替换然后添加

    <intent-filter tools:node="remove">
                    <action android:name="android.intent.action.MAIN"/>
    

    对于我不想有启动器图标的 Activity 启动器

    希望这会有所帮助。

    【讨论】:

    • 感谢您的更新。以前的解决方案一定有点烂。通过检查生成的中间清单,我验证了这在我使用它的两种产品风格中都能正常工作。
    【解决方案2】:

    如果您检查class that merges the manifests,您会发现mergeNewOrEqual() 方法不够聪明,无法合并不相同的元素。不幸的是,这是用于合并提供者和活动的方法。

    所以唯一的“解决方案”是要么只在一个地方定义元素,要么在两个定义中给它们相同的签名。

    【讨论】:

    • 感谢您的链接,它很有用。我们从外部团队继承了代码,因此不确定他们是否曾经获得过按原样构建的代码。现在我编辑了所有清单以使用相同的签名,在未来的版本中,我将重组代码库以更好地利用 gradle。
    【解决方案3】:

    如下声明清单的标题:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    

    然后,对要合并的任何活动、活动别名、服务、接收者或提供者元素使用以下适当属性之一:

    tools:merge="override"
    tools:merge="remove"
    

    此信息来自:
    https://android.googlesource.com/platform/tools/base/+/idea133/build-system/manifest-merger/src/main/java/com/android/manifmerger/ManifestMerger.java

    【讨论】:

    • 请解释“不起作用”。合并后的清单是什么样的?请提供子清单和超清单的副本。
    • 它会说:尝试合并不兼容的 /manifest/application/activity[@name=#provider#] 元素:
    • 你想合并什么类型的元素?请提供清单的 sn-p。
    • 您的解决方案不起作用: 我想合并 android:uiOptions ,错误失败
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2014-09-06
    • 1970-01-01
    • 2018-06-19
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多