Android build不会合并库中的清单

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--- 我们使用了

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

直到今天,我们使用:

  • 安卓工作室:2.2.1
  • 梯度:2.1.3
  • BuildTools版本:23.0.3
今天,我们更新到:

  • 安卓工作室:2.3
  • 梯度:2.3.0
  • buildToolsVersion:25.0.0
在这次更新之前,一切正常,清单被合并,我们有冲突,我们修复了它们。到我们完成更新时,清单将根本不会合并

---更新1---

我们使用了合并清单视图,看到它只是在合并中不包含清单,它从模块清单中合并的唯一事情是权限,因此,例如,如果我向模块清单添加新权限,它将只合并它,而不会合并其余元素

我保证有很多东西要合并

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

以下是一些有用的提示:

  • 尽可能多地更新和重建其他LIB
  • 删除所有依赖项,然后清理项目,然后再次添加它们。和 检查是否正确导入它们。这可以通过无问题地构建项目来实现
  • 请注意,由于gradle 2.2.0无法访问模块中的资产 应用程序内
  • 如果未按属性禁用合并进程,请检查清单:
    tools:node=“remove”
    tools:node=“removeAll”
    或在gradle中(请参阅 本)
  • 尝试创建一个带有模块和轨道合并的演示。然后匹配 输出到您的项目。这将清楚地表明这不是 配置问题,但Android Studio 2.3(因此请重新安装fresh (版本)
  • --更新日期(2)2017年4月5日--

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

    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”
    ,这是默认行为

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

    控制台中没有日志?没有错误