mPaaS Android 60 基线提供了多套开发环境间切换的能力,能够帮助开发者在多套开发环境间(如:开发 DEV/测试 TEST/体验 UAT/线上 PROD)方便自如地进行切换。
涉及 mPaaS 的改动
对于 mPaaS 开发者,在切换开发环境的过程中,涉及到以下配置文件的改动:
mPaaS 项目配置:项⽬中
.config
配置文件Ant-mpaas-xxx-Android.config
,配置在portal
的app
⽬录下,用于存放应用推送服务地址、网关服务地址等。详情参见 在控制台创建应用。RPC 数据加密配置:项目中
mpaas_netconfig.properties
配置⽂件,配置在portal
的assets
⽬录下,⽤于存放 RPC 数据加密方式、加密公钥等。详情参见 数据加密 > Android 配置。H5 容器配置:项⽬中
custom_config.json
配置文件,配置在portal
的assets
目录下,⽤于存放离线包验签开关、沉浸标题栏开关等。详情参见 H5 容器配置。离线包验签公钥:项目中利用公钥对离线包进行解密,配置在代码中,通过
Nebula
组件进行设置。详情参见 配置离线包。
切换开发环境时,需要将项⽬中涉及到上述配置之处进行手动替换或者修改。下一节将介绍如何通过 gradle 配置实现开发环境的自由切换。
解决方案
切换开发环境需要修改的配置有两种:
纯配置文件:即 mPaaS 项目配置、RPC 数据加密配置、H5 容器配置文件等。可以在编译阶段通过 gradle 脚本进行配置文件替换。
代码中的配置:即离线包验签公钥等。可以将其写在配置文件中,通过读取配置文件进行切换操作。
准备工作
在
portal-app
下,根据项目需求新建各个开发环境目录,存放不同环境的配置文件。将各个环境的 mPaaS 项目配置 拷贝到对应环境的目录下。
如果有 RPC 数据加密配置需要切换,将
mpaas_netconfig.properties
拷贝至对应目录。如果有 H5 容器配置 需要切换,将
custom_config.json
拷贝至对应目录。
切换配置文件
切换 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"
}
}
切换 RPC 数据加密配置
在 portal-app
的 gradle 中配置如下内容:
//配置 RPC 数据加密开发环境,将配置文件拷贝到 assets 资源目录下
def setNetConfigEnv(String type){
copy {
from "buildEnv/${type}/mpaas_netconfig.properties"
into "${rootDir}/app/src/main/assets"
}
}
切换 H5 容器配置
在 portal-app
的 gradle 中配置如下内容:
//配置离线包开发环境,将配置文件拷贝到 assets 资源目录下
def setNebulaEnv(String type){
copy {
from "buildEnv/${type}/custom_config.json"
into "${rootDir}/app/src/main/assets/config"
}
}
切换代码配置
切换离线包验签公钥
将离线包验签密钥写入 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); }
切换开发环境
在 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)
}
}
代码示例
在 portal-app
的 gradle 中调用切换方法:
buildTypes {
// 切换开发环境
switchBuildEnv('prod')
release {
...
}
debug {
...
}
}
点击这里 下载代码示例。