我们有多个项目,具体取决于许多Android lib模块。 为避免应用清单中出现重复的xml标记,我们将相关的接收者,服务和活动放在各自的模块中。
直到今天,我们使用了:
今天我们已更新为:
直到这次更新,一切正常并且清单合并,我们有冲突,我们修复了它们。截至我们已完成的更新,清单根本不会合并!!
---更新1 ---
我们已经使用了Merged Manifest视图,并且发现它只是没有在合并中包含清单,它从模块清单中唯一合并的是权限,例如,如果我向模块清单添加一个新的权限,它只会合并它而不是其他元素!
我保证合并有很多东西!
---更新2 ---
似乎所有在外面它将应用程序标记合并到主清单中,而在应用程序标记内的所有内容,它都没有。
---更新3 ---
无法合并的模块:
摇篮:
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion '25.0.0'
defaultConfig {
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
jniDebuggable true
}
}
}
dependencies {
compile project(path: ':android-infra')
compile 'com.google.android.gms:play-services-gcm:9.0.0'
compile project(path: ':engine-core-server')
compile project(path: ':engine-core-aneeda')
}
清单:
<manifest package="com.sensiya.voip.managers.gcm"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="com.google.android.c2dm.permission.KAKI"/>
<application
tools:node="replace">
<service
android:enabled="true"
android:name="com.sensiya.voip.managers.gcm.GcmIntentService"/>
<receiver android:name="com.sensiya.voip.managers.gcm.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<category android:name="com.iamplus.onenumber.device"/>
</intent-filter>
</receiver>
</application>
</manifest>
将合并的模块:
摇篮:
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion '25.0.0'
defaultConfig {
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
jniDebuggable true
}
}
}
dependencies {
compile project(path: ':android-infra')
compile 'com.sensiya:sense-services-client:1.24.2@aar'
compile project(path: ':engine-core-server')
compile project(path: ':engine-core-aneeda')
}
清单:
<manifest package="com.iamplus.android.senseServices"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
tools:node="replace">
<service
android:name="com.iamplus.senseServices.ContextualEventService"
android:enabled="true"/>
<service
android:name="com.iamplus.senseServices.Serv"
android:enabled="true"/>
<service
android:name="com.iamplus.senseServices.Serv1"
android:enabled="true"/>
</application>
</manifest>
有什么建议吗?
答案 0 :(得分:7)
可能有很多东西。既然你没有提供代码,我猜你会使用默认的合并行为。有关详细信息,请参阅:Merge conflict heuristics
您可以使用Merged Manifest view预览合并清单的结果并查找冲突错误。
通常,默认情况下合并应该有效。然后使用合并清单视图查看&amp;在合并期间丢失值的位置。使用Merge rule markers可以帮助您通过分配规则标记来管理合并。
如果根本没有合并。所以它可能是模块之间的依赖问题。
请注意,依赖顺序对具有相同优先级的模块起着至关重要的作用,例如库。
---更新5.April.2017 ---
以下是一些有用的提示:
tools:node=”remove"
或tools:node="removeAll"
或gradle(请参阅
这个Disable Manifest Merger in Android Gradle Build)---更新(2)5。5月2017年---
添加代码后,我可以看到您正在使用Attribute
tools:node="replace"
在模块中的应用程序元素下(也可能在应用程序的清单中)。我认为这就是为什么你没有从导入的模块合并到你的应用程序的清单中的任何清单合并的原因。请参阅Node markers下的tools:node="replace"
。
完全替换优先级较低的元素。也就是说,如果有的话 优先级较低的清单中的匹配元素,忽略它并使用 这个元素与此清单中显示的完全相同。
这意味着上面的两个模块永远不会与以下的清单合并:
所以摆脱该属性并清理和重建模块。然后重建整个项目。
答案 1 :(得分:2)
如果您遇到明显的合并冲突,您有两种选择。
1)找到项目中包含的所有清单文件,包括作为依赖项的库中的清单文件,并确保没有冲突的配置。
或2)在您的清单中添加一些合并解决规则,以规定应如何解决每个冲突。
这里有一个很棒的页面,里面有许多细节 https://developer.android.com/studio/build/manifest-merge.html
答案 2 :(得分:1)
来自 Android Studio
构建---&gt;清洁项目
然后
构建 - &gt;制作项目
这应该有助于修复
答案 3 :(得分:0)
我对Unity有类似的问题。我能够通过SDK Manager并删除最新的android api来解决它。然后我安装了一个稍微老一点的api并且它工作(我认为API 21或22)
答案 4 :(得分:0)
我最近在我的生产代码中遇到了同样的问题。 将一个库存入app模块也存在于其他Gradle Dependency中导致重复条目。 我们需要将这些模块或库从冲突模块中排除。
为此,我们必须知道特定Gadle依赖项所使用的库的数量。
考虑一下我使用&#34; bolt-android-1.2.0.jar&#34;在我的应用程序gradle中。 在同一个gradle中我使用facebookSDK如下。
compile('com.facebook.android:facebook-android-sdk:4.5.0')
所以我必须排除&#34; bolt-android&#34;如下所示
compile('com.facebook.android:facebook-android-sdk:4.5.0') {
exclude module: 'bolts-android'
}
那么如何知道facebookSDK使用&#34; bolt-android&#34;
您可以在此处使用插件 Android Method Count
答案 5 :(得分:0)
似乎问题是在tools:node="replace"
元素中使用application
。来自documentation:
...如果优先级较低的清单中存在匹配元素,请忽略它并完全按照此清单中的显示使用此元素。
您实际想要使用的是tools:node="merge"
,这是默认行为。
在使用合并冲突启发式方法没有冲突时,合并此标记中的所有属性和所有嵌套元素。这是元素的默认行为。