Android自定义产品口味的工作流程

时间:2013-10-12 01:46:35

标签: android android-intent android-build dagger

我有一个带有大量产品口味的应用程序,它们基本上是单个应用程序的白色标签。然而,偶尔会有一些与主流有所不同,因为客户想要的东西略有不同。 到目前为止,我们一直在编辑这些案例的代码并使用意大利面条代码(许多ifs和elses)来确保其他应用程序不会中断。毋庸置疑,这不是一种可扩展(甚至是理智)的方法。

一种选择是在productFlavor源文件夹中编写活动类,即src/flavor1/java/AnActivity.javasrc/flavor2/java/AnActivity.java等。 由于productFlavor代码无法覆盖src/main类,因此即使没有自定义,也需要为每个新的样式复制相同的类。我真的不太喜欢这个选项。它导致许多冗余代码和类名最终不再具有描述性,因为它们都必须具有相同的名称才能覆盖其他代码,即使它们可能正在做不同的事情。

另一种选择可能是使用Dagger之类的东西来构建ObjectGraph并为不同的实现注入Intent。例如,如果是flavor1,则单击按钮X时会注入ActivityA的意图,如果是flavor2,则会注入ActivityB的意图。

这似乎是一种更好的方法,但我仍然不确定如何实现会覆盖默认ObjectGraph中绑定的类。

有关实施或其他选项的任何想法?我不一定要Dagger,我只是开始研究依赖注入和测试,所以其他框架也能正常工作。

1 个答案:

答案 0 :(得分:5)

这就是我做的......

src/flavor1/java/com/myapp/Modules.java

public class Modules {
  public static Object[] get(Application app) {
    return new Object[] {
      new MyAppModule(app),
      new Flavor1Module(app)
    };
  }
}

src/flavor2/java/com/myapp/Modules.java

public class Modules {
  public static Object[] get(Application app) {
    return new Object[] {
      new MyAppModule(app),
      new Flavor2Module(app)
    };
  }
}

src/main/java/com/myapp/MyAppApplication.java

ObjectGraph og = ObjectGraph.create(Modules.get(this));

MyAppModule有共同的依赖关系。如果Flavor1ModuleFlavor2ModuleMyAppModule可以提供额外的依赖关系或覆盖overrides=true的依赖关系。