品牌Android应用程序

品牌Android应用程序,android,branding,Android,Branding,我们为多个客户提供服务。我们想提供的一个功能是android应用程序,它允许客户定制应用程序的品牌(图标、徽标、名称等) 这里有一些规定 客户端的客户将使用此应用程序 您可以是多个客户的客户,但我们无法向用户显示任何类型的客户列表 客户端无法共享单个应用程序 即使功能相同,每个客户端的应用程序外观也必须不同 是的,我知道以这种方式构建它是一个PITA,但我们的客户不希望其他客户的客户知道他们也是我们的客户 那么,构建一个易于品牌化的应用程序的最佳方法是什么,同时尽可能少地影响开发人员的理智?为每

我们为多个客户提供服务。我们想提供的一个功能是android应用程序,它允许客户定制应用程序的品牌(图标、徽标、名称等)

这里有一些规定

  • 客户端的客户将使用此应用程序
  • 您可以是多个客户的客户,但我们无法向用户显示任何类型的客户列表
  • 客户端无法共享单个应用程序
  • 即使功能相同,每个客户端的应用程序外观也必须不同
  • 是的,我知道以这种方式构建它是一个PITA,但我们的客户不希望其他客户的客户知道他们也是我们的客户


    那么,构建一个易于品牌化的应用程序的最佳方法是什么,同时尽可能少地影响开发人员的理智?

    为每个版本的应用程序保留一个单独的res/文件夹。为每个图标、徽标和字符串指定相同的名称,但为每个客户端定制内容,并通过简单地将res文件夹放到构建中,为每个客户端构建不同的.apk。我不认为你可以让自定义限定符来实现这一点,而仅仅是生成一个.apk——而且这将在任何情况下都将每个客户机的自定义图片和字符串绑定到每个人的应用程序中

    我将首先为全局重新命名开发一个脚本,因为您无论如何都需要它(只需使用find、xargs和sed即可完成)

    您需要对资源进行定制的工具,可以是SDK和Eclipse插件

    也许您可以创建某种扩展Eclipse插件的向导


    或者,通过大量工作但更易于使用,您可以独立完成一些操作,驱动必要的命令行工具来构建生成的包。

    您可以按照@Jems所说的操作,或者(假定应用程序与服务器通信)将“逻辑”放在服务器端

    第一次运行应用程序时,服务器将向您发送与本地存储的客户机对应的资源

    这种方法的问题:第一次你可能不得不下载一大堆东西

    优点:您只需更改一个属性字符串,说明哪一个是服务器,或登录到服务器,就可以知道它必须发送什么更改布局,而无需部署另一个具有不同资源的应用程序


    这实际上取决于您是否希望支持服务器端的布局更改。

    使用gradle的构建时解决方案可以通过productFlavors功能实现,如中所述

    可以在build.gradle文件中以以下方式定义Flavors(又名customer brands)(不同的软件包名称用于将每个品牌的apk部署为单独的应用程序):

    然后可以将品牌的特定android资源(而不是src/main/res目录)放入src/vanilla/res或src/草莓/res目录(在本例中,香草和草莓是品牌)。请注意,使用productFlavors功能,gradle不会合并资产,只会简单地替换文件,而不知道具体的res子目录


    在构建过程中,gradle将构建变体创建为构建类型(调试、发布)和productFlavor的组合,详见。

    Nice!如果你想将应用程序上传到google play,软件包名称有问题。您将如何为每个应用程序制作不同的软件包?也许只是在构建APK之前重命名Jenkins中的文件夹?
    productFlavors {
        vanilla {
            applicationId "com.example.multiflavorapp"
        }
    
        strawberry {
            applicationId "com.example.multiflavorapp.strawberry"
        }
    }