2016-12-13 94 views
0

我知道它可能有多种风味与他们每个人的配置。但我有一个大的配置列表(约15),我不想在构建配置中定义15味道。我正在寻找一些基于循环使用Gradle构建任务的方法,它可以通过更改配置风格或任何类似的方法,而无需手动定义所有风格。构建多个apk与一个风味和多个配置

有什么建议吗?

更新时间:

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密钥。

+0

您可以使用Groovy的全部功能集与它的表现力和紧凑性和动态性。是不是足够以紧凑的方式定义您的口味,不需要太多重复?我没有做Android开发,所以让我看看你的构建有2或3种风格,我可能会告诉你如何使它更简洁。 – Vampire

+0

@吸血鬼谢谢你,请出示你的解决方案。 –

+0

我没有在任何地方看到'api'或'key'。哪个部分是您需要15次的部件,哪些部件在15个实例中有所不同? – Vampire

回答

1

这会解决您的问题吗?

[ 
    '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 
     } 
    } 
} 
+0

我明白你的想法,但最好有一个任务用一个命令构建所有配置。您的代码通过代码生成15个构建版本。这很棒,但如果可以做到这一点,我会很高兴。 –

+0

只需完成一项取决于15个单独任务的任务,然后您就可以随时创建一种口味,但同时还有一项任务可以完成所有任务。每种口味需要调用什么? – Vampire

+0

构建apk的assembleRealese任务。 –