Gradle合并包装器/子模块的Android清单到主模块的清单中

时间:2014-01-20 16:58:18

标签: android-studio android-gradle

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

myproject_alpha
myproject_beta
myproject_lib
myproject_release

* _lib模块是包含所有源代码的项目的主要模块。其他3个模块是“包装模块”,对内容提供者的“权限”参数稍作修改,更改* _lib模块清单中指定的活动的intent过滤器内的“data”字段,并启用其他一些不存在的活动。 myproject_release模块。

目前,我已经在alpha(或beta或release)与lib之间使用Android清单合并错误。例如,在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”是相互依赖的模块而不是不同的构建。我会很感激一些反馈。

3 个答案:

答案 0 :(得分:1)

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

  

指令'merge'无效,有效指令如下:   拆卸,更换,严格

我发现在导入工具方面取得了成功,就像在@swooby回答中一样,然后在tools:node="merge"标记中为正在启动的活动添加<activity>我要替换然后添加

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

到Activity的启动器,我不想有一个启动器图标

希望这有帮助。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

声明清单的标题如下:

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

然后,在要合并的任何活动,activity-alias,service,receiver或provider元素上使用以下适当的属性之一:

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