我的项目中有以下模块,我无法让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”是相互依赖的模块而不是不同的构建。我会很感激一些反馈。
答案 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"