Android,Gradle,产品口味和清单

Rob*_*ham 7 android gradle android-build android-productflavors android-build-flavors

build.gradle,我有产品口味设置:

productFlavors
{
    AlternateFlavour
    {
        applicationId "com.myapp.alternateflavour"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在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']
        }
   }
Run Code Online (Sandbox Code Playgroud)

好到目前为止.

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

<?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" >
Run Code Online (Sandbox Code Playgroud)

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

<?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" >
Run Code Online (Sandbox Code Playgroud)

这会导致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.
Run Code Online (Sandbox Code Playgroud)

为什么它会尝试与原始清单合并,当我指定它应该在其他地方看?

我怎么能阻止这个?

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

Rob*_*ham 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" >
Run Code Online (Sandbox Code Playgroud)

请注意这两个tools片段。

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

  • 版本号
  • 版本名称
  • 地图 API 密钥

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