Android design/architecture: 从相同的代码库创建不同的应用程序

Android design/architecture: Create different Apps from same code base

我想从相同的代码库创建两个应用程序。它们的颜色不同,一些数据来自后端。情况就像,假设我想创建应用程序 App1 和 App2。两者都有相似的流量。我可以吗

  1. Select Header 颜色如果是 App1 是蓝色,其他是红色?
  2. 在代码中,if(运行 App == App1) { 执行这部分} else {other 部分}?
  3. 如果 App 是 App1 select layout1.xml for activity else select layout2.xml?

我不知道该怎么做。任何帮助都会很棒。

谢谢。

如果您使用的是 Android Studio,则您所描述的是产品风味。引用 the documentation:

A product flavor defines a customized version of the application build by the project. A single project can have different flavors which change the generated application.

为了回答这个问题,让我们假设您有一个项目有两种产品风格,flavorOneflavorTwo。您的项目还将具有三个源集:

  • src/main/,你的大部分东西都去哪里了
  • src/flavorOne/,一种口味的东西在哪里
  • src/flavorTwo/,其他口味的东西去了哪里

考虑到这一点...

Select a Header color Blue if it is App1 and Red for other?

src/main/res/values/colors.xml中,定义一个名为header的颜色,并赋予其蓝色值。在src/flavorTwo/res/values/colors.xml中,定义一个名为header的颜色,并赋予其红色值。您应用的其余部分引用 header 颜色(例如,@color/headerR.color.header)。当您构建 flavorOne 时,将使用 main 颜色。当您构建 flavorTwo 时,flavorTwo 值将覆盖 main 值。

If App is App1 select layout1.xml for activity else select layout2.xml?

src/main/res/layout/thingy.xml 中,定义您的默认布局实现。在 src/flavorTwo/res/layout/thingy.xml 中,定义要用于 flavorTwo 的布局。您的 Java 代码将引用 R.layout.thingy。当您构建 flavorOne 时,将使用 main 布局。当您构建 flavorTwo 时,flavorTwo 布局将覆盖 main 布局。

In code, if(running App == App1) { execute this part} else {other part}?

这在一定程度上取决于您有多少不同的代码。

如果是实质性的,可以使用策略模式:

  • src/flavorOne/java/

  • 中有一个 StuffStrategy 的实现
  • src/flavorTwo/java/

  • 中实现StuffStrategy
  • 在您的 src/main/java 代码中,参考 StuffStrategy,它将根据您正在构建的风格引入正确的实现

如果代码变化真的很小,您可以使用 buildConfigField 为要添加到 BuildConfig class,其中该值会因口味而异。 This Stack Overflow answer 显示详细信息。

如果您没有使用Android Studio,那么我会提到另一种可能性。对于主要功能,您可以创建一个库项目作为两个应用程序的基础(将其作为库项目检查,并将其作为库包含到两个单独的项目中),然后扩展您想要的活动 类最终会有不同的行为。

例如(简单的),如果您有两个具有不同启动布局的应用程序,比方说 splash.xml,您可以在库项目中创建这个默认的,并在布局文件夹中创建一个不同的在其他项目的资源目录中同名。第二个项目将使用它自己的布局文件夹中的那个。

我会推荐 Android Studio 和 Gradle with flavors,如@CommonsWare 的回答,但如果你不使用它,你也可以这样做。