2014-03-19 26 views
11

我試圖定義一個buildConfigVariable取決於味道 + buildType。理想情況下,這是我想要的buildConfigField取決於香精+ buildType

productFlavors { 
    strawberry { 
     buildConfigField "String", "WS_API_KEY", name + variant.buildType.name 
    } 
    ... more flavors .. 
} 

確實含有「草莓」,但我不知道是否有可能訪問變種buildType

放在的Android封我有訪問BuildType變種外面,但我不能調用buildConfigField

android.applicationVariants.all { variant -> 
    println "****************************" 
    println "variant: ${variant.name}" 
    println "flavor: ${variant.flavorName}" 
    println "****************************" 

    if (variant.buildType.name == 'release') { 
     if (variant.flavorName == 'strawberry') { 
      buildConfigField "String", "WS_API_KEY", '"strawberry_release"' 
     } else { 
      buildConfigField "String", "WS_API_KEY", '"chocolate_release"' 
     } 
    } else if(variant.buildType.name == 'debug') { 
     if (variant.flavorName == 'strawberry') { 
      buildConfigField "String", "WS_API_KEY", '"strawberry_debug"' 
     } else { 
      buildConfigField "String", "WS_API_KEY", '"chocolate_debug"' 
     } 
    } 


**************************** 
variant: strawberryRelease 
flavor: strawberry 
**************************** 
org.gradle.api.internal.MissingMethodException: 
    Could not find method buildConfigField() 
    for arguments [String, WS_API_KEY, "strawberry_release"] 

我可以很容易地創建一個Java工廠並返回適當的API_KEY取決於一些BuildConfig常量,但我寧願保持代碼配置不可知。

+0

另外:[如何將buildConfigField添加到單個productFlavors?](https://plus.google.com/u/0/112378857970945433614/posts/DoNedk9Vq2e) – JJD

回答

12

EDIT2:0.14.2後的版本將允許這樣做:

applicationVariants.all { variant -> 
    variant.buildConfigField "int", "VALUE", "1" 
} 

所以你可以做這樣的事情(以匹配原來的問題):

applicationVariants.all { variant -> 
    variant.buildConfigField "String", "WS_API_KEY", variant.productFlavors.get(0).name + '_' + variant.buildType.name 
} 

編輯:目前不可能。這個API缺少。 錯誤: https://code.google.com/p/android/issues/detail?id=67416

試試這個:

applicationVariants.all { variant -> 
    variant.mergedFlavor.buildConfigField "String", "NAME", '"VALUE"' 
} 

+0

引發錯誤MissingMethodException:沒有方法的簽名:com .android.builder.DefaultProductFlavor.buildConfigField()適用於參數類型:(java.lang.String,java.lang.String,java.lang.String)values:[String,NAME,「VALUE」] 可能的解決方案: getBuildConfigFields() – Maragues

+0

我有我自己的解決方案,它可能很脆弱,所以我很樂意看到更好的解決方案。我會在5分鐘後發佈。 – Maragues

+0

哦,是的,mergedFlavor不是這個適當的類型。讓我看看。 –

0

警告:這可能是一個脆弱的解決方案,使用您自己的風險。見https://code.google.com/p/android/issues/detail?id=67416

這就是我如何完成我想要的。您需要在執行任務之前更改這些值,因此我需要一種方法將代碼綁定到那裏。

final projectName = project.name 
gradle.taskGraph.beforeTask { Task task -> 
    if (task.path ==~ /:$projectName:generate.*BuildConfig/) { 
     //extracts flavor and buildType name. See http://stackoverflow.com/a/7594052/218473 for regex 
     final values = task.name.replace("generate","").replace("BuildConfig","").split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])") 

     final flavorName = values[0].toLowerCase() 
     final buildTypeName = values[1].toLowerCase() 

     com.android.build.gradle.api.ApplicationVariant variant; 
     android.applicationVariants.all { currentVariant -> 
      if (currentVariant.getVariantData().getVariantConfiguration().getBuildType().getName() == buildTypeName) { 
       if (currentVariant.getVariantData().getVariantConfiguration().getFlavorName() == flavorName) { 
        variant = currentVariant; 
       } 
      } 
     } 

     if(variant != null) { 
      com.android.builder.internal.ClassFieldImpl apiKeyField 
      if (flavorName == 'strawberry') {  
       if (buildTypeName == 'release') { 
        apiKeyField = new com.android.builder.internal.ClassFieldImpl("String", "WS_API_KEY", '"strawberry_release"') 
       } else { 
        apiKeyField = new com.android.builder.internal.ClassFieldImpl("String", "WS_API_KEY", '"strawberry_debug"') 
       } 
      } else if (flavorName == 'chocolate') {       
       if (buildTypeName == 'release') { 
        apiKeyField = new com.android.builder.internal.ClassFieldImpl("String", "WS_API_KEY", '"chocolate_release"') 
       } else { 
        apiKeyField = new com.android.builder.internal.ClassFieldImpl("String", "WS_API_KEY", '"chocolate_debug"') 
       } 
      } 

      variant.getVariantData().getVariantConfiguration().getFlavorConfigs().get(0).addBuildConfigField(apiKeyField) 
     } 
    } 
} 

要理解爲什麼這個作品,下載AOSP源代碼,並檢查VariantConfiguration.getBuildConfigItems()

使用Xavier的答案拋出一個MethodMissingError。如果我使用variant.mergedFlavor.addBuildConfigField()沒有錯誤,但不添加變量。

+0

您可以使用公共API,不需要'ClassFieldImpl':'com.android.builder.model.ClassField apiKeyField',然後聲明'def createClassField = com.android.builder.core.AndroidBuilder。&createClassField',然後代替調用'new ClassFieldImpl(...)',你可以調用'createClassField(...)'。 – TWiStErRob