因为公司开发的APP大多给B端用户使用,不同项目都多多少少会有一些定制化的修改,例如
APP名称、logo、部分页面布局,服务器地址等,所有针对每个项目都需要单独打包。一步步下来也经过了四个阶段:
第一阶段:按项目直接修改
如果项目1需要修改服务器地址和APP名称,那就拉个分支直接修改完打包
如果项目2要修改APP的部分页面和logo,那就再拉个分支修改
问题:
随着项目增多,修改越来越多,分支越来越多,维护难度很大
第二阶段:共用一个分支,包含各个项目的修改
针对资源和部分页面逻辑的定制化,按项目进行不同处理,app的build.gradle部分如下
'''
sourceSets {
main {
jniLibs.srcDirs = ['libs']
java.srcDir('src/main/java')
}
project1{
res.srcDir('src/project1/res')
java.srcDir('src/project1/java')
}
project2 {
java.srcDir('src/project2/java')
}
'''
问题:
服务器地址、企业标识码等虽然独立于功能之外,还是要单独拉分支修改,项目较多时,重复工作依然较多
第三阶段:抽取企业标识码、服务器地址、相关的key(地图key、推送key)等做成公共变量
这样就可以将所有项目配置信息保存下来,如果有新的项目需要打包,也只需增加配置信息就可以直接打包了
productFlavors {
project1{
dimension "company"
// 每个环境包名不同
applicationId "cn.com.project.project1"
// 动态添加 string.xml 字段;
// 注意,这里是添加,在 string.xml 不能有这个字段,会重名!!!
resValue "string", "app_name", "项目A"
buildConfigField "String", "SERVER_URL", '"http://api.projectA.com.cn/projectA"'
}
project2{
dimension "company"
// 每个环境包名不同
applicationId "cn.com.project.project2"
// 动态添加 string.xml 字段;
// 注意,这里是添加,在 string.xml 不能有这个字段,会重名!!!
resValue "string", "app_name", "项目A"
buildConfigField "String", "SERVER_URL", '"http://api.projectB.com.cn/projectB"'
}
....
}
第四阶段:项目配置信息放到公有云服务器,通过企业表示码获取项目配置信息
公有云后台保存各个私有云的配置信息,包括企业标识码、服务器地址、应用名称等
然后APP输入企业标识码后去公有云获取项目的配置信息,然后再在app里设置项目信息,后续逻辑就直接连项目相关的服务器了。
这样就基本能一包通用了,改地址、名称等基本的信息就不用重新打包了