1. 背景
mPaaS Android 提供了多套开发环境间切换的能力,能够帮助开发者在多套开发环境下(⽐如:开发dev/测试test/体验uat/线上prod)方便自如地进行切换。
1.1 涉及mPaaS的改动
对于mPaaS开发者,在切换开发环境的过程中,涉及到以下配置文件的改动:
- mPaaS项目配置:项⽬中.config配置文件
Ant-mpaas-xxx-Android.config
,配置在portal的app⽬录下,用于存放应用推送服务地址、网关服务地址等;参考⽂档:https://tech.antfin.com/docs/2/86439 - rpc数据加密配置:项目中
mpaas_netconfig.properties
配置⽂件,配置在portal
的assets
⽬录下,⽤于存 放rpc数据加密方式、加密公钥等,参见文档档:https://tech.antfin.com/docs/2/72752#Android 配置 - H5容器配置:项⽬目中
custom_config.json
配置文件,配置在portal
的assets
目录下,⽤于存放离线包验签开关、沉浸标题栏开关等,参⻅文档:https://tech.antfin.com/docs/2/118673 - 离线包验签公钥:项目中利用公钥对离线包进行解密,配置在代码中,通过
Nebula
组件进行设置;参见文档:https://tech.antfin.com/docs/2/64580# - UCSDK key:项⽬中使用UC内核时需要申请,配置在
AndroidManifest
⽂件中;参见文 档:https://tech.antfin.com/docs/2/112551
切换开发环境时,需要将项⽬中涉及到的上述配置的地⽅进行手动替换或者修改。下一小节将介绍如何通过gradle配置实现开发环境的自有切换。
2. 解决方案
切换开发环境需要修改的这些配置有两种:
- 纯配置文件(mPaaS项目配置、rpc数据加密配置、H5容器配置文件)。
- 这类配置,可以在编译期通过gradle脚本进行配置文件替换。
- 代码中的配置(离线包验签公钥、UCSDK key)。
- 这类配置,可以将其写在配置文件中,通过读取配置文件进行切换操作。
2.1. 准备工作
- 在portal-app下,根据项目需求新建各个开发环境目录,存放不同环境的配置文件;
- 将各个环境的mPaaS项目配置拷贝到对应环境的目录下;
- 如果有rpc数据加密配置需要切换,将
mpaas_netconfig.properties
拷贝对应目录; - 如果有H5容器配置需要切换,将
custom_config.json
拷贝对应目录。
2.2. 配置文件的切换
2.2.1. 切换 mPaaS 项目配置
在portal-app的gradle中配置
//配置mPaaS App开发环境,将.config配置文件拷贝到主Module下
def setAppConfigEnv(String type){
File configFile = file("${rootDir}/app").listFiles().find{File f ->
f.name.endsWith(".config")
}
if(configFile != null && configFile.exists()){
delete(configFile)
}
copy {
from "buildEnv/${type}"
into "${rootDir}/app"
include "**/*.config"
}
}
2.2.2. 切换 rpc 数据加密配置
在portal-app的gradle中配置
//配置RPC数据加密开发环境,将配置文件拷贝到assets资源目录下
def setNetConfigEnv(String type){
copy {
from "buildEnv/${type}/mpaas_netconfig.properties"
into "${rootDir}/app/src/main/assets"
}
}
2.2.3. 切换 H5 容器配置
在portal-app的gradle中配置
//配置离线包开发环境,将配置文件拷贝到assets资源目录下
def setNebulaEnv(String type){
copy {
from "buildEnv/${type}/custom_config.json"
into "${rootDir}/app/src/main/assets/config"
}
}
2.3. 代码配置的切换
2.3.1. 切换离线包验签公钥
- 将离线包验签密钥写入H5容器配置的custom_config.json文件中;
[
{
"value": "YES",
"key": "h5_shouldverifyapp"
},
{
"value": "your public key",
"key": "h5_shouldverifyapp_pubkey"
}
]
- 通过读取H5容器配置获取离线包验签公钥,通过切换 H5容器配置实现切换离线包验签公钥;
/**
* 根据H5容器配置文件解析离线包验签公钥
* @return 离线包验签公钥
*/
public String getAppVerificationPubkey(){
String configStr = getFromAssets("config/custom_config.json");
JSONArray jsonArray = JSON.parseArray(configStr);
if(jsonArray != null && jsonArray.size() > 0){
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String key = jsonObject.getString("key");
if(key.equals("h5_shouldverifyapp_pubkey")){
String value = jsonObject.getString("value");
return value;
}
}
}
return null;
}
/**
* 获取portal assets目录文件内容
* @param fileName 文件名称
* @return 文件内容
*/
public String getFromAssets(String fileName){
try {
MicroApplicationContext context = MPFramework.getMicroApplicationContext();
InputStreamReader inputReader = new InputStreamReader(context.getApplicationContext().getResources().getAssets().open(fileName));
BufferedReader bufReader = new BufferedReader(inputReader);
String line= "";
String Result= "";
while((line = bufReader.readLine()) != null)
Result += line;
return Result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
- 设置离线包验签公钥
String pubkey = getAppVerificationPubkey();
if(!TextUtils.isEmpty(pubkey)){
MPNebula.enableAppVerification(pubkey);
}
2.3.2. 切换 UCSDK key
UCSDK key 存放在AndroidManifest.xml
中;
...
...
可以通过在portal-app
的gradle中配置manifestPlaceholders
进行切换:
buildTypes {
release {
manifestPlaceholders = [GRADLE_APP_UCKEY : 'your release uc key']
...
}
debug {
...
manifestPlaceholders = [GRADLE_APP_UCKEY : 'your debug uc key']
...
}
}
2.4. 开发环境的切换
在portal-app
的gradle中配置,通过调用该方法,传入环境参数实现自动切换
// 根据环境类型切换开发环境
// type = dev/test/uat/prod 可根据配置目录自由扩展
def switchBuildEnv(String type){
setAppConfigEnv(type)
if(file("buildEnv/${type}/custom_config.json").exists()){
setNebulaEnv(type)
}
if(file("buildEnv/${type}/mpaas_netconfig.properties").exists()){
setNetConfigEnv(type)
}
}
2.5. 使用示例
在portal-app
的 gradle 中调用切换方法
buildTypes {
// 切换开发环境
switchBuildEnv('prod')
release {
...
}
debug {
...
}
}