Android构build不会合并库中的清单

我们有多个项目,取决于许多Android的lib模块。 为避免应用程序清单中出现重复的XML标记,我们将相关的接收者,服务和活动放在各自的模块中。

直到今天,我们使用:

  • Android Studio:2.2.1
  • gradle:2.1.3
  • buildToolsVersion:23.0.3

今天我们已经更新到:

  • Android Studio:2.3
  • gradle:2.3.0
  • buildToolsVersion:25.0.0

直到这个更新,一切正常,清单合并,我们有冲突,我们修复它们。 至于我们所做的更新,清单将不会合并!

—更新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') } 

performance:

 <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') } 

performance:

 <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> 

有什么build议么?

Solutions Collecting From Web of "Android构build不会合并库中的清单"

这可能是很多事情。因为你没有提供代码,我猜你会使用默认的合并行为。 有关更多信息,请参阅: 合并冲突启发式

您可以使用“ 合并清单”视图来预览合并的清单的结果,并查找冲突错误。

一般来说,默认情况下合并应该工作。 然后,只需使用合并清单视图来查看在合并期间如何以及在何处丢失了值。 使用合并规则标记可帮助您通过分配规则标记来pipe理合并。

如果没有合并的话。 所以这可能是模块之间的依赖问题。

请注意,依赖性顺序对具有相同优先级的模块(如库)起着至关重要的作用。

—更新5.2017年4月

这里有一些有用的提示:

  1. 尝试尽可能地更新和重build其他库。
  2. 删除所有依赖项,然后清理项目,然后再添加它们。 并检查是否正确导入它们。 这可以通过build立没有问题的项目来完成。
  3. 请注意,由于来自模块的gradle 2.2.0资产将无法在应用程序中访问。
  4. 检查你清单如果合并过程不是通过属性exciplicitly禁用: tools:node=”remove"tools:node="removeAll"或在gradle(见这禁用清单合并在Android的Gradle构build )
  5. 尝试使用模块创build演示并跟踪合并。 然后将输出匹配到您的项目。 这将明确表示不是configuration问题,但Android Studio 2.3(所以然后重新安装新鲜版本)

—更新(2)5.四月.2017

添加了代码后,我可以看到您正在使用Attribute

 tools:node="replace" 

在你的模块中的应用程序元素(也可能在应用程序的清单中)。 我认为这就是为什么你没有得到合并到你的应用程序的清单导入模块的任何清单合并。 请参阅节点标记下的tools:node="replace"

完全replace较低优先级的元素。 也就是说,如果低优先级清单中存在匹配的元素,请忽略它,并使用与此清单中显示的完全相同的元素。

这意味着上面的两个模块将永远不会得到任何东西与清单合并:

  • Android的红外
  • com.sensiya:感服务的客户端:1.24.2
  • 发动机核心服务器
  • 发动机核心aneeda

所以摆脱这个属性,清理和重build模块。 然后重build整个项目。

如果你得到明显的合并冲突,你有两个select。

1)find包含在你的项目中的所有清单文件,包括库中那些依赖项,并确保没有冲突的configuration。

或者2)向你的清单添加一些合并解决规则来决定如何解决每个冲突。

这里有一个伟大的网页,有很多细节。
https://developer.android.com/studio/build/manifest-merge.html

Android Studio

build立—>清洁项目
然后
build立 – >build立项目
这应该有助于解决

我对Unity有类似的问题。 我能够解决它通过去SDKpipe理器,并删除最新的Android API。 然后我安装了一个稍微老一点的API,它工作(API 21或22我认为)

什么SDKpipe理器看起来像

我最近有我的生产代码相同的问题。 在其他Gradle依赖项中也存在一个库到app模块中会导致重复条目。 我们需要将这些模块或库从冲突的模块中排除。

为此,我们必须知道一个特定的Gadle依赖关系使用的库的数量。

考虑一下我在应用gradle中使用“bolts-android-1.2.0.jar”的情况。 在同一个gradle我使用facebookSDK如下。

 compile('com.facebook.android:facebook-android-sdk:4.5.0') 

所以我必须排除如下所示的“bolt-android”

 compile('com.facebook.android:facebook-android-sdk:4.5.0') { exclude module: 'bolts-android' } 

所以如何知道facebookSDK使用“bolt-android”

在这里你可以使用插件的 Android方法计数

看起来问题来自application元素中的tools:node="replace" 。 从文档 :

…如果优先级较低的清单中存在匹配的元素,请忽略它,并使用与此清单中显示的完全相同的元素。

你真正想要使用的是tools:node="merge" ,这是默认的行为。

使用合并冲突启发式方法在没有冲突时合并此标记中的所有属性和所有嵌套元素 。 这是元素的默认行为。