2017-05-24 77 views

回答

2

這不是很漂亮,但這樣的事情爲我工作:

android { 

    ... 

    defaultConfig { 

     ... 

     buildConfigField "boolean", "A", "false" 
     buildConfigField "boolean", "B", "false" 
     println "value of A:" + buildConfigFields.get("A").value 
     println "value of B:" + buildConfigFields.get("B").value 

     boolean AandB = Boolean.valueOf(buildConfigFields.get("A").value) && Boolean.valueOf(buildConfigFields.get("B").value) 
     println "value of AandB:" + AandB 

     buildConfigField "boolean", "C", String.valueOf(AandB); 
     println "value of C:" + buildConfigFields.get("C").value 
    } 
} 

當你建立你應該Android Studio中的gradle這個控制檯中看到這個項目:

A的值:false
B的值:false
值AandB的:C假
值:false

我相信這在所有工作是因爲defaultConfig配置閉合這裏裏面的東西被委託給ProductFlavor的實例延伸DefaultProductFlavor延伸的原因BaseConfigImpl包含公共方法「getBuildConfigFields」。

但是,我沒有看到「getBuildConfigFields」正式記錄爲ProductFlavor上的一種方法,我擔心它可能無法始終供我們使用。

還要注意buildConfigFields.get()給你ClassField的一個實例:

public interface ClassField { 
    @NonNull 
    String getType(); 

    @NonNull 
    String getName(); 

    @NonNull 
    String getValue(); 

    @NonNull 
    String getDocumentation(); 

    @NonNull 
    Set<String> getAnnotations(); 
} 

因此需要得到它的價值和轉換從字符串通過調用通過Boolean.valueOf爲布爾值()。

2

此代碼,您android.defaultConfig塊內寫的,正是這麼做的:

buildConfigField("boolean", "TEST_A", "false"); 
    buildConfigField("boolean", "TEST_B", "false"); 
    buildConfigField("boolean", "TEST_C", "TEST_A && TEST_B"); 

這將導致以下行你BuildConfig.java

public static final boolean TEST_A = false; 
    public static final boolean TEST_B = false; 
    public static final boolean TEST_C = TEST_A && TEST_B; 

一個有趣的事情時要注意以這種方式聲明構建配置值,如果您看看如何構造BuildConfig.java,您可以看到在特定的構建版本中聲明的字段e(例如android.buildTypes.debug)出現在默認配置中聲明的字段之前。

在例子中提供的,如果你想TEST_C依賴於實際的構建類型,你需要在構建類型級別聲明TEST_ATEST_B,而不是在默認級別。