Android版本不会合并库

时间:2017-03-26 13:37:36

标签: android android-studio android-gradle android-manifest

我们有多个项目,具体取决于许多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视图,并且发现它只是没有在合并中包含清单,它从模块清单中唯一合并的是权限,例如,如果我向模块清单添加一个新的权限,它只会合并它而不是其他元素!

Nothing to merge

我保证合并有很多东西!

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

有什么建议吗?

6 个答案:

答案 0 :(得分:7)

可能有很多东西。既然你没有提供代码,我猜你会使用默认的合并行为。有关详细信息,请参阅:Merge conflict heuristics

您可以使用Merged Manifest view预览合并清单的结果并查找冲突错误。

通常,默认情况下合并应该有效。然后使用合并清单视图查看&amp;在合并期间丢失值的位置。使用Merge rule markers可以帮助您通过分配规则标记来管理合并。

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

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

---更新5.April.2017 ---

以下是一些有用的提示:

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

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

    tools:node="replace"
    

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

      

    完全替换优先级较低的元素。也就是说,如果有的话   优先级较低的清单中的匹配元素,忽略它并使用   这个元素与此清单中显示的完全相同。

    这意味着上面的两个模块永远不会与以下的清单合并:

    • 机器人-下文
    • com.sensiya:有义服务客户端:1.24.2
    • 发动机核心服务器
    • 发动机芯aneeda

    所以摆脱该属性并清理和重建模块。然后重建整个项目。

答案 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)

What the SDK Manager looks like

答案 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",这是默认行为。

  

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