2017-03-16 54 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中的字段)

祝你好运。