今天我开始将我们的项目转换为使用gradle构建系统。我无法改变项目结构,我有不同的口味,所以我想知道如何覆盖“dev”和“prod”的源集,因为这显然不起作用:
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 :(得分:10)
您需要首先声明您的口味,然后自定义sourceSets。
当您自定义sourceSets时,它创建了android.sourceSets.dev,但是当创建android.productFlavors.dev时,它会尝试创建匹配的android.sourceSets.dev并失败(因为它已经存在)。 / p>
我们真的不知道已经创建的sourceSet是同一个东西,所以当你意味着将它用于其他东西时,我们会失败而不是潜在地使用sourceSet。
答案 1 :(得分:4)
谢谢,这对我有用。
在我的旧式项目中,我需要两个用于亚马逊和三星版本的res版本。现在有三个res文件夹,其中包含一个带有一些布尔标志的flavors.xml文件。
res/values/flavors.xml
res-samsung/values/flavors.xml
res-amazon/values/flavors.xml
gradle文件首先定义了风格:
productFlavors {
amazon {
}
samsung {
}
}
然后,在sourceSet闭包中,我不添加,只是更改隐含生成的flavor-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文件夹内容,结果我在适当的风格APK中有所需的布尔标记。