2017-03-16 55 views

回答

1

不,我們不能這樣做。相關模塊無法訪問App模塊的BuildConfig文件。

您的問題的唯一替代解決方案是您需要添加相同的屬性到您的依賴項BuildConfig文件。

1

最簡單的方法是創建第三個模塊(庫),並將此模塊添加到庫模塊和應用程序模塊的依賴關係中。

然後把共享構建配置到共享的第三個模塊。

app module <------------------ library module 
    ^       ^
    |        | 
    | dependency      |dependency 
    ------------ third module ------- 
0

一般來說,BuildConfig有靜態成員。所以我會建議反思將您的BuildConfig作爲模型列表保存字段/值

我們需要一個模型來包含所有類成員的字段和值。讓我們把它叫做BuildConfigItem(我建議把這個類目的地模塊):

public class BuildConfigItem { 
     public final Field field; 
     public final Object object; 

     public BuildConfigItem(Field field, Object object) { 
      this.field = field; 
      this.object = object; 
     } 
    } 

現在你可以得到BuildConfig的所有集體成員使用此方法。想法是將它們轉換成可以獨立於其他模塊上進行檢索便攜式階段,甚至不知道什麼BuildConfig有:

public static ArrayList<BuildConfigItem> getBuildConfigField() { 
    ArrayList<BuildConfigItem> list = new ArrayList<>(); 
    Field[] declaredFields = BuildConfig.class.getDeclaredFields(); 
    BuildConfig buildConfig=new BuildConfig(); 
    for (Field field : declaredFields) { 
     if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) { 
      try { 
       BuildConfigItem buildConfigItem = new BuildConfigItem(field, field.get(buildConfig)); 
       list.add(buildConfigItem); 
      } catch (IllegalAccessException e) { 
       Log.e(TAG, "error during assigning fields: ", e); 
      } 
     } 
    } 
    return list; 
} 

讓您的BuildConfigItem列表:

ArrayList<BuildConfigItem> buildConfigItemArrayList = getBuildConfigField(); 

然後把它傳遞給你的模塊。這裏是簡單的方法如何迭代該列表來獲取值: for(BuildConfigItem buildConfigItem:buildConfigItemArrayList){ Log.d(TAG,buildConfigItem.field.getName()+「:」+ buildConfigItem.object); }

這裏是如何列出的所有值和鑄造常見類型:

for (BuildConfigItem buildConfigItem : buildConfigItemArrayList) { 
    if (buildConfigItem.field.getType() == String.class) { 
     String value = (String) buildConfigItem.object; 
     Log.d(TAG, "String:" + buildConfigItem.field.getName() + ":" + value); 
    } else if (buildConfigItem.field.getType() == int.class) { 
     Integer value = (Integer) buildConfigItem.object; 
     Log.d(TAG, "integer:" + buildConfigItem.field.getName() + ":" + value); 
    } else if (buildConfigItem.field.getType() == boolean.class) { 
     Boolean value = (Boolean) buildConfigItem.object; 
     Log.d(TAG, "boolean:" + buildConfigItem.field.getName() + ":" + value); 
    } else { 
     Log.d(TAG, "Other:" + buildConfigItem.field.getName() + ":" + buildConfigItem.object); 
    } 
} 

完蛋了

您需要,如果你定義BuildConfig場的自定義類型來調整這個代碼。即日期或更復雜的類型。

另請注意,目標模塊應該具有BuildConfig類型的所有依賴關係。 (如果你使用自己的對象來定義BuildConfig中的字段)

祝你好運。