一.背景:
目前我们的app主要是在googlePlay上架, 为了扩大覆盖面,我们需要在华为,小米等海外商店上架自己的App,但因为是海外商店的原因,要求包名id不一样,也就是一个新的app。
二.存在问题:
我们目前的工程配置是实现不了了,乃至于在好几次给华为,小米单独打包的时候,都是拉取之前配置好代码的华为、小米分支。单独打包。这导致每次打包都很费时间,需要切分支,而且无法没有影响的合入不断迭代的功能。
在googleplay商店和华为商店的App在功能上也有所不同,主要是登录服务体系与sku购置,支付体系不同。因此在华为商店的App我们停止更新了一年之久,中间将近30个版本的功能都没有并入。
三.解决方法:
- 工程构建方案
经过调研,我决定采用多渠道,多包名配置的方案,通过Gradle文件的配置来实现分渠道与包;通过抽象接口服务来实现相同业务,不同服务支持的实现。
- 业务处理三方问题
因为我们的App集成了facebook与GoogleAD,做了验证后,目前因修改包名,不会影响这两个服务的使用。因此,在业务上的处理我们的重点都在登录逻辑和支付体系上。
多产品配置
1.gradle配置
在主module的build.gradle配置app维度,productFlavors可配置多个不同特性的app,如下我们配置普通的app和华为特性的app,我们在这里配置app的id,渠道信息,最终打出的包他们的这些信息都会不一样,类似应用多开的感觉(当前,它们的实现机制截然不同,应用双开的技术未有了解),有两种方案可供选择:
A方案:通过applicationIdSuffix属性来配置华为的包名, applicationIdSuffix
标识默认的应用 ID 上追加一段,在最后构建后,它会将所有的包名都替换为新的,包名无法完全替换,只能在尾部追加名称
//google play store 与 huaWei store 配置
flavorDimensions "app"
productFlavors {
demo {
dimension "app"
manifestPlaceholders = [YOGA_CHANNEL_NAME:"google", YOGA_CHANNEL_CODE:"600001"]
}
huaWei {
dimension "app"
applicationIdSuffix ".huawei"
manifestPlaceholders = [YOGA_CHANNEL_NAME:"h2o_huawei", YOGA_CHANNEL_CODE:"300001"]
}
}
B方案:通过配置全新的applicationId来更改包名,可以完全替换包名,B方案看起来清晰明了一些,我们选择B方案:
//google play store 与 huaWei store 配置
flavorDimensions "app"
productFlavors {
demo {
dimension "app"
applicationId "com.demo.inc"
manifestPlaceholders = [YOGA_CHANNEL_NAME:"google", YOGA_CHANNEL_CODE:"600001"]
}
huaWei {
dimension "app"
applicationId "com.demo.inc.huawei"
manifestPlaceholders = [YOGA_CHANNEL_NAME:"h2o_huawei", YOGA_CHANNEL_CODE