我们为多个客户提供服务。我们想要提供的一个功能是一个允许客户端自定义应用程序品牌(图标、徽标、名称等)的 android 应用程序。
这里有一些规定。
- 客户的客户将使用此应用程序。
- 您可能是多个客户的客户,但我们无法向用户显示任何类型的客户列表。
- 客户端不能共享单个应用程序。
- 即使功能相同,应用程序也必须能够在每个客户端看起来不同
是的,我知道以这种方式构建它是一个 PITA,但我们的客户不希望其他客户的客户知道他们也是我们的客户。
那么,构建一个易于品牌化的应用程序的最佳方式是什么?
为每个版本的应用程序保留一个单独的 res/ 文件夹。为每个图标、徽标和字符串赋予相同的名称,但为每个客户端定制内容,并通过简单地将 res 文件夹放入构建中,为每个客户端构建不同的 .apk。我不认为您可以让自定义限定符为此工作而只制作一个 .apk - 在任何情况下,这都会将每个客户的自定义图片和字符串捆绑到每个人的应用程序中。
我将从开发一个全局重命名脚本开始,因为无论如何你都需要它(可以使用 find、xargs 和 sed 相当简单地完成)
您将需要用于对资源进行自定义的工具,这可能是 SDK 和 Eclipse 插件
也许您可以创建某种扩展 Eclipse 插件的向导。
或者通过大量工作但更容易使用,您可以单独做一些事情来驱动必要的命令行工具来构建生成的包。
您可以按照@Jems 所说的去做,或者(假设应用程序与服务器通信)将“逻辑”放在服务器端。
第一次运行应用程序时,服务器将向您发送与您的客户端对应的资源,这些资源存储在本地。
这种方法的问题:第一次你可能需要下载大量的东西......
优点:您只需更改一个属性字符串,说明哪个是服务器,或者登录到服务器以了解它必须发送什么来更改布局,而无需部署具有不同资源的另一个应用程序。
这真的取决于您是否要支持服务器端的布局更改。
使用 gradle 的构建时间解决方案可以通过 productFlavors 功能实现,详见http://blog.robustastudio.com/mobile-development/android/building-multiple-editions-of-android-app-gradle/
风味(又名客户品牌)可以通过以下方式在 build.gradle 文件中定义(此处使用不同的包名称将每个品牌 apk 部署为单独的应用程序):
productFlavors {
vanilla {
applicationId "com.example.multiflavorapp"
}
strawberry {
applicationId "com.example.multiflavorapp.strawberry"
}
}
然后可以将品牌的特定 android 资源(而不是 src/main/res 目录)放入 src/vanilla/res 或 src/strawberry/res 目录(在这种情况下 vanilla 和草莓是品牌)。请注意,使用 productFlavors 功能,gradle 不会合并资产,只会简单地替换文件,而无需了解特定 res 子目录。
在构建过程中,gradle 将构建变体创建为构建类型(调试、发布)和 productFlavor 的组合,更多信息请参见http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-类型-产品-风味-构建-变体。