Android build不会合并库中的清单
我们有多个项目,这取决于许多Android lib模块。 为了避免应用程序清单中重复的xml标记,我们将相关的接收者、服务和活动放在各自的模块中 直到今天,我们使用:Android build不会合并库中的清单,android,android-studio,android-gradle-plugin,android-manifest,Android,Android Studio,Android Gradle Plugin,Android Manifest,我们有多个项目,这取决于许多Android lib模块。 为了避免应用程序清单中重复的xml标记,我们将相关的接收者、服务和活动放在各自的模块中 直到今天,我们使用: 安卓工作室:2.2.1 梯度:2.1.3 BuildTools版本:23.0.3 今天,我们更新到: 安卓工作室:2.3 梯度:2.3.0 buildToolsVersion:25.0.0 在这次更新之前,一切正常,清单被合并,我们有冲突,我们修复了它们。到我们完成更新时,清单将根本不会合并 ---更新1--- 我们使用了
- 安卓工作室:2.2.1
- 梯度:2.1.3
- BuildTools版本:23.0.3
- 安卓工作室:2.3
- 梯度:2.3.0
- buildToolsVersion:25.0.0
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')
}
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.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>
舱单:
<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>
有什么建议吗?如果您遇到清单合并冲突,您有两个选择 1) 查找项目中包含的所有清单文件,包括库中作为依赖项的清单文件,并确保没有冲突的配置 或者2)将一些合并解决规则添加到清单中,以指示如何解决每个冲突 这里有一个很棒的页面,有很多细节。
可能有很多问题。由于您没有提供代码,我猜您使用的是默认合并行为。有关详细信息,请参阅: 您可以使用预览合并清单的结果并查找冲突错误 通常,默认情况下,合并应该可以工作。然后只需使用合并清单视图查看在合并过程中丢失值的方式和位置。使用将帮助您通过指定规则标记来管理合并 如果根本没有合并。因此,这可能是模块之间的依赖性问题。 请注意,对于具有相同优先级的模块(如库),依赖顺序起着至关重要的作用 ——2017年4月5日更新--- 以下是一些有用的提示:
tools:node=“remove”
或tools:node=“removeAll”
或在gradle中(请参阅
本)tools:node="replace"
在模块中的应用程序元素下(可能也在应用程序的清单中)。我认为这就是为什么您没有从合并到应用程序清单的导入模块中获得任何清单的原因。请参阅下面的tools:node=“replace”
完全替换低优先级元素。也就是说,如果存在
匹配低优先级清单中的元素,忽略它并使用
此元素与此清单中显示的元素完全相同
这意味着上述两个模块将永远不会从以下位置获得任何与清单合并的内容:
- 安卓infra
- com.sensiya:sense服务客户端:1.24.2
- 引擎核心服务器
- 发动机核心阿内达
因此,去掉该属性,清理并重建模块。然后重建整个项目。来自Android Studio
compile('com.facebook.android:facebook-android-sdk:4.5.0')
构建--->清洁项目然后
生成-->生成项目
这将有助于修复Unity的一个类似问题。我可以通过使用SDK管理器并删除最新的android api来解决这个问题。然后我安装了一个稍旧的api,它运行正常(我想是api 21或22)
我最近在生产代码中遇到了同样的问题。 将一个库放入应用程序模块也存在于其他Gradle依赖项中会导致重复条目。 我们需要从冲突的模块或库中排除此类模块或库 为此,我们必须知道特定Gadle依赖项使用的库的数量 考虑一下我在应用程序gradle中使用“bolt-android-1.2.0.jar”的情况。 在同一等级中,我使用facebookSDK,如下所示。
compile('com.facebook.android:facebook-android-sdk:4.5.0')
因此我必须排除下面的“安卓螺栓”
compile('com.facebook.android:facebook-android-sdk:4.5.0') {
exclude module: 'bolts-android'
}
那么,如何知道facebookSDK使用的是“android”呢
这里您可以使用plugin问题似乎来自于在
应用程序元素中使用工具:node=“replace”
…如果较低优先级清单中有匹配的元素,请忽略它,并完全按照此清单中显示的方式使用此元素
您实际想要使用的是tools:node=“merge”
,这是默认行为
当不存在冲突时,使用合并冲突启发法合并此标记中的所有属性和所有嵌套元素。这是元素的默认行为
控制台中没有日志?没有错误