2013-06-22 33 views
4

今天我开始将我们的项目转换为使用gradle构建系统。我不能改变项目结构,和我有不同的味道,所以我想知道我怎么能覆盖为“开发”和“刺”的sourceset,因为这显然是行不通:Gradle productflavors源代码集和旧项目结构

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4.2' 
    } 
} 

apply plugin: 'android' 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17" 

    dependencies { 
     compile project(':ABS') 
     compile project(':google-play-services_lib') 
     compile project(':MergeAdapter') 
     compile fileTree(dir: 'libs', include: '*.jar') 
    } 

    signingConfigs { 
     release { 
      storeFile file("myapp.keystore") 
        storePassword "**********" 
        keyAlias "**********" 
        keyPassword "**********" 
     } 
    } 

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

     dev { 
      java.srcDirs = ['src-dev'] 
     } 

     prod { 
      java.srcDirs = ['src-prod'] 
     } 

     instrumentTest.setRoot('tests') 
    } 

    productFlavors { 
     dev { 
      packageName "com.myapp.dev" 
     } 

     prod { 
      packageName "com.myapp" 
     } 
    } 

    buildTypes { 
     release { 
      signingConfig signingConfigs.release 
     } 
    } 
} 

这给我下面的错误:

Cannot add a AndroidSourceSet with name 'dev' as a AndroidSourceSet with that name already exists. 

的事情是,我不能使用新的项目结构,我坚持这一个,所以我怎么在这里覆盖源目录,以便它包括开发人员版,src-dev和prod版本src-prod(而不是src/main/java和src/dev/java或src/prod/java)

Thx!

编辑:src-prod和src-dev目录只包含具有用于指向不同环境的常量的类。我将使用资产(dev env的不同图标)做同样的工作

+0

android flavors demo http://goo.gl/5NSnEM – nitesh

回答

10

您需要首先声明您的风味,然后自定义sourceSets。

发生什么事是,当你自定义sourceSets时,它创建了android.sourceSets.dev,但是当创建android.productFlavors.dev时,它尝试创建一个匹配的android.sourceSets.dev并失败(因为它已经存在)。

我们无法真正知道已经创建的sourceSet意味着是同一件事,所以我们失败了,而不是在您将其用于其他目的时用于该风格的sourceSet。

4

谢谢,这对我有用。

在我的旧式项目中,我需要为亚马逊和三星构建两个res变体。现在有三个res文件夹包含一个带有一些布尔标志的flavors.xml文件。

res/values/flavors.xml 
res-samsung/values/flavors.xml 
res-amazon/values/flavors.xml 

的gradle这个文件首先定义口味:

productFlavors { 
    amazon { 
    } 

    samsung { 
    } 
} 

然后,在sourceSet关闭,我不加,但只是改变目录为隐含产生的风味sourceSets:

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

samsung.res.srcDirs = ['res-samsung'] 
amazon.res.srcDirs = ['res-amazon'] 

instrumentTest.setRoot('tests') 
} 

Gradle的mergeXXXResources任务随后支持res-xxx文件夹内容,因此我在适当的flavor口令中拥有所需的布尔标志。