构建具有风味和多个配置的多个 apk
Build multiple apk with a flavor and multiple config
我知道可以为每个配置提供多种风格。但我有一个很大的配置列表(大约 15 个),我不想在构建配置中定义 15 个风格。我正在寻找一些基于循环 gradle 构建任务并更改风味配置的方法或任何不需要手动定义所有风味的类似方法。
有什么建议吗?
更新:
repositories {
mavenCentral()
}
apply plugin: 'com.android.application'
android {
Properties props = new Properties()
props.load(new FileInputStream(file('build.properties')))
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.example.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
resConfigs "en"
versionCode props['VERSION_CODE'].toInteger()
versionName props['VERSION_NAME']
buildConfigField('boolean', 'DEBUG_MODE', "false")
buildConfigField('String', 'DEBUG_VERSION', props['EMPTY_STRING'])
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles 'proguard-rules.pro'
}
}
sourceSets {
sd_debug {
assets {
srcDirs('src/sd_debug/assets')
}
java {
srcDirs('src/sd_debug/java')
}
res {
srcDirs('src/sd_debug/res')
}
}
sp_debug {
assets {
srcDirs('src/sd_debug/assets')
}
java {
srcDirs('src/sd_debug/java')
}
res {
srcDirs('src/sd_debug/res')
}
}
sd_debug_devpackage {
assets {
srcDirs('src/sd_debug/assets')
}
java {
srcDirs('src/sd_debug/java')
}
res {
srcDirs('src/sd_debug/res')
}
}
sp_prod {
assets {
srcDirs('src/main/assets')
}
java {
srcDirs('src/sp_prod/java')
}
res {
srcDirs('src/sp_prod/res')
}
}
}
productFlavors {
// develop flavor
sd_debug {
buildConfigField 'String', 'DEBUG_VERSION', props['DEBUG_VERSION']
buildConfigField 'boolean', 'DEBUG_MODE', "true"
buildConfigField 'Integer', 'HOST_ID', "90"
}
sp_debug {
buildConfigField 'String', 'DEBUG_VERSION', props['DEBUG_VERSION']
buildConfigField 'boolean', 'DEBUG_MODE', "true"
buildConfigField 'Integer', 'HOST_ID', "1"
}
sd_debug_devpackage {
buildConfigField 'String', 'DEBUG_VERSION', props['DEBUG_VERSION']
buildConfigField 'boolean', 'DEBUG_MODE', "true"
buildConfigField 'Integer', 'HOST_ID', "91"
}
sp_prod {
buildConfigField 'boolean', 'DEBUG_MODE', "false"
buildConfigField 'Integer', 'HOST_ID', "1"
}
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude '.readme'
}
dexOptions {
jumboMode = true
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
compile "com.android.support:design:$rootProject.supportLibraryVersion"
compile "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion"
compile "com.google.android.gms:play-services-base:$rootProject.playServiceVersion"
compile "com.google.android.gms:play-services-gcm:$rootProject.playServiceVersion"
compile "com.google.android.gms:play-services-analytics:$rootProject.playServiceVersion"
compile "com.squareup.okhttp3:okhttp:$rootProject.okhttpVersion"
compile "com.google.code.gson:gson:$rootProject.gsonVersion"
compile "com.j256.ormlite:ormlite-core:$rootProject.ormliteVersion"
compile "com.j256.ormlite:ormlite-android:$rootProject.ormliteVersion"
compile "com.jakewharton:butterknife:$rootProject.butterknifeVersion"
compile "me.dm7.barcodescanner:zbar:$rootProject.zbarVersion"
compile "de.greenrobot:eventbus:$rootProject.eventbusVersion"
// compile "io.reactivex:rxjava:$rootProject.rxjavaVersion"
// compile "io.reactivex:rxandroid:$rootProject.rxjavaVersion"
compile "com.google.dagger:dagger:$rootProject.daggerVersion"
annotationProcessor "com.google.dagger:dagger-compiler:$rootProject.daggerVersion"
// Dependencies for local unit tests
testCompile "junit:junit:$rootProject.ext.junitVersion"
testCompile "org.mockito:mockito-all:$rootProject.ext.mockitoVersion"
testCompile "org.hamcrest:hamcrest-all:$rootProject.ext.hamcrestVersion"
testCompile "org.powermock:powermock-module-junit4:$rootProject.ext.powerMockito"
testCompile "org.powermock:powermock-api-mockito:$rootProject.ext.powerMockito"
// Android Testing Support Library's runner and rules
androidTestCompile "com.android.support.test:runner:$rootProject.ext.runnerVersion"
androidTestCompile "com.android.support.test:rules:$rootProject.ext.rulesVersion"
// Espresso UI Testing dependencies.
androidTestCompile "com.android.support:support-annotations:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support:design:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support.test.espresso:espresso-core:$rootProject.ext.espressoVersion"
androidTestCompile "com.android.support.test.espresso:espresso-contrib:$rootProject.ext.espressoVersion"
androidTestCompile "com.android.support.test.espresso:espresso-intents:$rootProject.ext.espressoVersion"
}
每种口味都必须使用 api 键构建,而我有 15 个 api 键。
这会解决您的问题吗?
[
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'10',
'11',
'12',
'13',
'14',
'15'
].each { hostId ->
sourceSets {
"sp_prod_$hostId" {
assets {
srcDirs('src/main/assets')
}
java {
srcDirs('src/sp_prod/java')
}
res {
srcDirs('src/sp_prod/res')
}
}
}
productFlavors {
"sp_prod_$hostId" {
buildConfigField 'boolean', 'DEBUG_MODE', "false"
buildConfigField 'Integer', 'HOST_ID', hostId
}
}
}
我知道可以为每个配置提供多种风格。但我有一个很大的配置列表(大约 15 个),我不想在构建配置中定义 15 个风格。我正在寻找一些基于循环 gradle 构建任务并更改风味配置的方法或任何不需要手动定义所有风味的类似方法。
有什么建议吗?
更新:
repositories {
mavenCentral()
}
apply plugin: 'com.android.application'
android {
Properties props = new Properties()
props.load(new FileInputStream(file('build.properties')))
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.example.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
resConfigs "en"
versionCode props['VERSION_CODE'].toInteger()
versionName props['VERSION_NAME']
buildConfigField('boolean', 'DEBUG_MODE', "false")
buildConfigField('String', 'DEBUG_VERSION', props['EMPTY_STRING'])
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles 'proguard-rules.pro'
}
}
sourceSets {
sd_debug {
assets {
srcDirs('src/sd_debug/assets')
}
java {
srcDirs('src/sd_debug/java')
}
res {
srcDirs('src/sd_debug/res')
}
}
sp_debug {
assets {
srcDirs('src/sd_debug/assets')
}
java {
srcDirs('src/sd_debug/java')
}
res {
srcDirs('src/sd_debug/res')
}
}
sd_debug_devpackage {
assets {
srcDirs('src/sd_debug/assets')
}
java {
srcDirs('src/sd_debug/java')
}
res {
srcDirs('src/sd_debug/res')
}
}
sp_prod {
assets {
srcDirs('src/main/assets')
}
java {
srcDirs('src/sp_prod/java')
}
res {
srcDirs('src/sp_prod/res')
}
}
}
productFlavors {
// develop flavor
sd_debug {
buildConfigField 'String', 'DEBUG_VERSION', props['DEBUG_VERSION']
buildConfigField 'boolean', 'DEBUG_MODE', "true"
buildConfigField 'Integer', 'HOST_ID', "90"
}
sp_debug {
buildConfigField 'String', 'DEBUG_VERSION', props['DEBUG_VERSION']
buildConfigField 'boolean', 'DEBUG_MODE', "true"
buildConfigField 'Integer', 'HOST_ID', "1"
}
sd_debug_devpackage {
buildConfigField 'String', 'DEBUG_VERSION', props['DEBUG_VERSION']
buildConfigField 'boolean', 'DEBUG_MODE', "true"
buildConfigField 'Integer', 'HOST_ID', "91"
}
sp_prod {
buildConfigField 'boolean', 'DEBUG_MODE', "false"
buildConfigField 'Integer', 'HOST_ID', "1"
}
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude '.readme'
}
dexOptions {
jumboMode = true
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
compile "com.android.support:design:$rootProject.supportLibraryVersion"
compile "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion"
compile "com.google.android.gms:play-services-base:$rootProject.playServiceVersion"
compile "com.google.android.gms:play-services-gcm:$rootProject.playServiceVersion"
compile "com.google.android.gms:play-services-analytics:$rootProject.playServiceVersion"
compile "com.squareup.okhttp3:okhttp:$rootProject.okhttpVersion"
compile "com.google.code.gson:gson:$rootProject.gsonVersion"
compile "com.j256.ormlite:ormlite-core:$rootProject.ormliteVersion"
compile "com.j256.ormlite:ormlite-android:$rootProject.ormliteVersion"
compile "com.jakewharton:butterknife:$rootProject.butterknifeVersion"
compile "me.dm7.barcodescanner:zbar:$rootProject.zbarVersion"
compile "de.greenrobot:eventbus:$rootProject.eventbusVersion"
// compile "io.reactivex:rxjava:$rootProject.rxjavaVersion"
// compile "io.reactivex:rxandroid:$rootProject.rxjavaVersion"
compile "com.google.dagger:dagger:$rootProject.daggerVersion"
annotationProcessor "com.google.dagger:dagger-compiler:$rootProject.daggerVersion"
// Dependencies for local unit tests
testCompile "junit:junit:$rootProject.ext.junitVersion"
testCompile "org.mockito:mockito-all:$rootProject.ext.mockitoVersion"
testCompile "org.hamcrest:hamcrest-all:$rootProject.ext.hamcrestVersion"
testCompile "org.powermock:powermock-module-junit4:$rootProject.ext.powerMockito"
testCompile "org.powermock:powermock-api-mockito:$rootProject.ext.powerMockito"
// Android Testing Support Library's runner and rules
androidTestCompile "com.android.support.test:runner:$rootProject.ext.runnerVersion"
androidTestCompile "com.android.support.test:rules:$rootProject.ext.rulesVersion"
// Espresso UI Testing dependencies.
androidTestCompile "com.android.support:support-annotations:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support:design:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support.test.espresso:espresso-core:$rootProject.ext.espressoVersion"
androidTestCompile "com.android.support.test.espresso:espresso-contrib:$rootProject.ext.espressoVersion"
androidTestCompile "com.android.support.test.espresso:espresso-intents:$rootProject.ext.espressoVersion"
}
每种口味都必须使用 api 键构建,而我有 15 个 api 键。
这会解决您的问题吗?
[
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'10',
'11',
'12',
'13',
'14',
'15'
].each { hostId ->
sourceSets {
"sp_prod_$hostId" {
assets {
srcDirs('src/main/assets')
}
java {
srcDirs('src/sp_prod/java')
}
res {
srcDirs('src/sp_prod/res')
}
}
}
productFlavors {
"sp_prod_$hostId" {
buildConfigField 'boolean', 'DEBUG_MODE', "false"
buildConfigField 'Integer', 'HOST_ID', hostId
}
}
}