5

build.gradle,我的产品口味设置:的Android,摇篮,产品的口味和清单

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 [email protected] 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. 

为什么它试图merg当我指定它应该看别处?

我该如何解决这个问题?

我希望有人会质疑为什么我这样做,或者为什么我不使用建议的风味项目结构。那么,我需要一个正常的清单在Gradle外部使用,例如从Eclipse部署(请一次一个!),我也需要通过构建过程注入的版本。

回答

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片段。

我知道这件事的,可是我被推迟尝试它,因为完整的摇篮错误提出了3个问题:

  • 的versionCode
  • 的versionName
  • 的地图API密钥

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

4

为什么它试图与原始的清单合并,当我指定它应该看别处?

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

  • main
  • 生成类型
  • 的产品风味(S)

清单中main始终是相关的。

我该如何阻止?

只要在main中的清单总是相关的,那么您不这样做。

最好的解决办法,一般是让来自所有舱单摆脱versionCodeversionName,使他们在build.gradle,你有充分的编程控制。

下一个最好的解决方案是移动versionCodeversionNamemain明显的融入产品的味道,你不在这里显示。我从来没有见过任何人创造一种产品的味道,因为AFAIK它是毫无意义的—你只能建立一种产品的味道(因为一旦你引入口味,AFAIK没有无味的版本)。产品口味通常为2+组(例如,使用Play服务的味道google和不包含standalone味道的组)。如果main中的值确实为非AlternateFlavour的风味,请将您的mainversion...东西移到那里。

除此之外,欢迎您查看the documentation on the manifest merger process,看看您是否可以在正确的指示下获得您想要的。

+0

所以首先,这里有很多味道 - 我只是试图保持给定的例子简单。我不能(AFAIK)从原始清单中删除属性,因为这是IDE部署使用的属性。不过,我可以创建第三个,没有属性,并默认使用Gradle。似乎过度! –

+0

@RobPridham:“这是IDE部署使用的那个” - 如果您使用的是Android Studio,Build Variants工具控制IDE使用的内容。 – CommonsWare

+0

确实。不幸的是 - 仍然使用Eclipse和ADT进行这种开发,以获得各种优秀(尽管不太好)的原因。 –