Android定制产品口味工作流
我有一个应用程序,有一系列的产品口味,基本上是一个应用程序的白色标签。然而,偶尔会有一些与主流不同的地方,因为客户机想要一些稍微不同的东西。 到目前为止,我们一直在编辑这些案例的代码,并使用意大利面代码(许多ifs和ELSE)确保其他应用程序不会崩溃。不用说,这不是一种非常可扩展(甚至不明智)的方法 一种选择是在productFlavor源文件夹中编写活动类,即Android定制产品口味工作流,android,android-intent,android-build,dagger,Android,Android Intent,Android Build,Dagger,我有一个应用程序,有一系列的产品口味,基本上是一个应用程序的白色标签。然而,偶尔会有一些与主流不同的地方,因为客户机想要一些稍微不同的东西。 到目前为止,我们一直在编辑这些案例的代码,并使用意大利面代码(许多ifs和ELSE)确保其他应用程序不会崩溃。不用说,这不是一种非常可扩展(甚至不明智)的方法 一种选择是在productFlavor源文件夹中编写活动类,即src/flavor1/java/AnActivity.java,src/flavor2/java/AnActivity.java,等等
src/flavor1/java/AnActivity.java
,src/flavor2/java/AnActivity.java
,等等。
由于productFlavor代码不能覆盖src/main
类,因此即使没有自定义,也需要为每个新的flavor复制相同的类。我真的不太喜欢这个选项。这会导致大量冗余代码和类名不再具有描述性,因为它们都必须具有相同的名称才能覆盖其他名称,即使它们可能正在执行不同的操作
另一种选择是使用类似于Dagger
的东西来构建ObjectGraph
并为不同的实现注入意图。例如,如果是flavor1
,当单击按钮X时,将注入ActivityA
的意图,如果是flavor2
,将注入ActivityB
的意图
这似乎是一种更好的方法,但我仍然不确定如何实现覆盖默认ObjectGraph
中绑定的类
有关于实现或其他选项的想法吗?我并不一定要使用Dagger,我只是开始研究依赖注入和测试,以便其他框架也能正常工作。以下是我的工作
在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)
};
}
}
public class Modules {
public static Object[] get(Application app) {
return new Object[] {
new MyAppModule(app),
new Flavor2Module(app)
};
}
}
ObjectGraph og = ObjectGraph.create(Modules.get(this));
在src/flavor2/java/com/myapp/Modules.java
:
public class Modules {
public static Object[] get(Application app) {
return new Object[] {
new MyAppModule(app),
new Flavor1Module(app)
};
}
}
public class Modules {
public static Object[] get(Application app) {
return new Object[] {
new MyAppModule(app),
new Flavor2Module(app)
};
}
}
ObjectGraph og = ObjectGraph.create(Modules.get(this));
在src/main/java/com/myapp/MyAppApplication.java
:
public class Modules {
public static Object[] get(Application app) {
return new Object[] {
new MyAppModule(app),
new Flavor1Module(app)
};
}
}
public class Modules {
public static Object[] get(Application app) {
return new Object[] {
new MyAppModule(app),
new Flavor2Module(app)
};
}
}
ObjectGraph og = ObjectGraph.create(Modules.get(this));
MyAppModule
具有通用依赖项<如果overrides=true
,volvor2module
,则code>volvor1module和volvor2module
可以提供额外的依赖项或覆盖MyAppModule
中的依赖项
在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)
};
}
}
public class Modules {
public static Object[] get(Application app) {
return new Object[] {
new MyAppModule(app),
new Flavor2Module(app)
};
}
}
ObjectGraph og = ObjectGraph.create(Modules.get(this));
在src/flavor2/java/com/myapp/Modules.java
:
public class Modules {
public static Object[] get(Application app) {
return new Object[] {
new MyAppModule(app),
new Flavor1Module(app)
};
}
}
public class Modules {
public static Object[] get(Application app) {
return new Object[] {
new MyAppModule(app),
new Flavor2Module(app)
};
}
}
ObjectGraph og = ObjectGraph.create(Modules.get(this));
在src/main/java/com/myapp/MyAppApplication.java
:
public class Modules {
public static Object[] get(Application app) {
return new Object[] {
new MyAppModule(app),
new Flavor1Module(app)
};
}
}
public class Modules {
public static Object[] get(Application app) {
return new Object[] {
new MyAppModule(app),
new Flavor2Module(app)
};
}
}
ObjectGraph og = ObjectGraph.create(Modules.get(this));
MyAppModule
具有通用依赖项<如果overrides=true
,volvor2module
可以提供额外的依赖项,或者覆盖MyAppModule
中的依赖项!就这样。。。我开始爱上匕首了。。只是另一个有点相关的问题。如果存在对公共依赖项的覆盖,这是否会影响测试中的任何覆盖。换句话说,覆盖可以被覆盖吗?实际上我不确定。我不知道这是怎么处理的。我倾向于说最后一个模块赢了(因为它们已经被订购了),但我必须深入研究。在依赖此行为之前在本地进行实验!是 啊我是想偷懒。谢谢。@JakeWharton,我有同样的问题,但是关于匕首2。你能看看这个吗:哇!就这样。。。我开始爱上匕首了。。只是另一个有点相关的问题。如果存在对公共依赖项的覆盖,这是否会影响测试中的任何覆盖。换句话说,覆盖可以被覆盖吗?实际上我不确定。我不知道这是怎么处理的。我倾向于说最后一个模块赢了(因为它们已经被订购了),但我必须深入研究。在依赖此行为之前在本地进行实验!是 啊我是想偷懒。谢谢。@JakeWharton,我有同样的问题,但是关于匕首2。你能看看这个吗: