7

build.gradle中,我设置了产品风味:

productFlavors
{
    AlternateFlavour
    {
        applicationId "com.myapp.alternateflavour"
    }
}

然后在 sourceSets 部分,我为这些风格使用不同的资源、资产和清单目录:

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }

    AlternateFlavour {
        manifest.srcFile 'manifest-tmp/AlternateFlavour/AndroidManifest.xml'
        java.srcDirs = ['src']
        res.srcDirs = ['res-tmp/AlternateFlavour']
        assets.srcDirs = ['assets-tmp/AlternateFlavour']
        }
   }

到目前为止还可以。

在风味使用的清单中,部分是自动生成的,我有:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myapp.myapp"
    android:versionCode="1010001"
    android:versionName="V1.1.0.1" >

但在根项目的原始清单中如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myapp.myapp"
    android:versionCode="1010000"
    android:versionName="V1.1.0.DEBUG" >

这会导致 Gradle 失败:

Error:
    Attribute manifest@versionCode value=(1010001) from AndroidManifest.xml:4:5-28
    is also present at AndroidManifest.xml:4:5-28 value=(1010000).
Attributes of <manifest> elements are not merged.

为什么它试图与原始清单合并,当我指定它应该在别处寻找时?

我该如何阻止呢?

我希望有些人会质疑我为什么要这样做,或者确实为什么我不使用建议的风味项目结构。好吧,我需要一个在 Gradle 之外使用的普通清单,例如从 Eclipse 部署(请一次做一件事!),我还需要在构建过程中注入版本。

4

3 回答 3

4

为什么它试图与原始清单合并,当我指定它应该在其他地方查找时?

你说风味清单在别处。清单合并过程合并所有相关清单:

  • main
  • 构建类型
  • 产品风味
  • 图书馆

清单main总是相关的。

我该如何阻止呢?

你没有,只要清单main总是相关的。

一般来说,最好的解决方案是摆脱所有清单,并将它们设置versionCode在您可以完全编程控制的地方。versionNamebuild.gradle

下一个最佳解决方案是将清单移出versionCodeversionName移出main到您未在此处显示的产品风味中。我从未见过有人只创造一种产品风味,因为 AFAIK 毫无意义——你只能构建一种产品风味(因为 AFAIK 一旦引入风味就没有无味的构建)。产品风味通常以 2+ 为一组(例如,google使用 Play Services 的standalone风味和不使用 Play Services 的风味)。如果里面的值main真的是非AlternateFlavour风味的,把你的main version...东西移到那里。

除此之外,欢迎您查看有关清单合并过程的文档,看看您是否可以输入正确的指令来获得您想要的东西。

于 2016-03-04T12:58:08.507 回答
0

我会记住@CommonsWare 在他们的回答中所说的话,但现在,我已经解决了这个问题:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.myapp.myapp"
    tools:replace="android:versionName,android:versionCode"
    android:versionCode="1010001"
    android:versionName="V1.1.0.1" >

注意这两个tools片段。

我最初知道这一点,但我推迟了尝试,因为完整的 Gradle 错误涉及三个问题:

  • 版本代码
  • 版本名称
  • 地图 API 密钥

所有这些都是自动插入的。然而,它只是tools:replace作为最后一个建议的建议,所以我的印象是它不适用于manifest属性。事实上确实如此。

于 2016-03-04T13:09:32.227 回答
0

Android官方文档会告诉你为什么在构建过程中会合并多个manifest文件。

合并多个清单文件

当我想用不同的 versionCode 和 versionName 获得不同的风格时,我遇到了同样的问题。当你想要这样做时,从 AndroidManifest.xml 中删除所有 versionCode 和 versionName 并尝试在build.gradle文件中做风格。

于 2018-05-28T03:43:05.770 回答