全部产品

mPaaS Android 工程如何在多套开发环境间切换

更新时间:2020-06-16 15:08:13

背景

mPaaS Android 60 基线提供了多套开发环境间切换的能力,能够帮助开发者在多套开发环境间(如:开发 DEV/测试 TEST/体验 UAT/线上 PROD)方便自如地进行切换。

涉及 mPaaS 的改动

对于 mPaaS 开发者,在切换开发环境的过程中,涉及到以下配置文件的改动:

  • mPaaS 项目配置:项⽬中 .config 配置文件 Ant-mpaas-xxx-Android.config,配置在 portal 的 app ⽬录下,用于存放应用推送服务地址、网关服务地址等。详情参见 在控制台创建应用
  • RPC 数据加密配置:项目中 mpaas_netconfig.properties 配置⽂件,配置在 portalassets ⽬录下,⽤于存放 RPC 数据加密方式、加密公钥等。详情参见 数据加密 > Android 配置
  • H5 容器配置:项⽬目中 custom_config.json 配置文件,配置在 portalassets 目录下,⽤于存放离线包验签开关、沉浸标题栏开关等。详情参见 H5 容器配置
  • 离线包验签公钥:项目中利用公钥对离线包进行解密,配置在代码中,通过 Nebula 组件进行设置。详情参见 配置离线包
  • UC SDK key:项⽬中使用 UC 内核时需要申请,配置在 AndroidManifest ⽂件中。详情参见 添加 UC SDK

切换开发环境时,需要将项⽬中涉及到上述配置之处进行手动替换或者修改。下一节将介绍如何通过 gradle 配置实现开发环境的自有切换。

解决方案

切换开发环境需要修改的配置有两种:

  • 纯配置文件:即 mPaaS 项目配置、RPC 数据加密配置、H5 容器配置文件等。可以在编译阶段通过 gradle 脚本进行配置文件替换。
  • 代码中的配置:即离线包验签公钥、UCSDK key 等。可以将其写在配置文件中,通过读取配置文件进行切换操作。

准备工作

  • portal-app 下,根据项目需求新建各个开发环境目录,存放不同环境的配置文件。
  • 将各个环境的 mPaaS 项目配置 拷贝到对应环境的目录下;
  • 如果有 RPC 数据加密配置需要切换,将 mpaas_netconfig.properties 拷贝至对应目录;
  • 如果有 H5 容器配置 需要切换,将 custom_config.json 拷贝至对应目录。

切换配置文件

切换 mPaaS 项目配置

portal-app 的 gradle 中配置如下内容:

  1. //配置 mPaaS App 开发环境,将 .config 配置文件拷贝到主 Module 下
  2. def setAppConfigEnv(String type){
  3. File configFile = file("${rootDir}/app").listFiles().find{File f ->
  4. f.name.endsWith(".config")
  5. }
  6. if(configFile != null && configFile.exists()){
  7. delete(configFile)
  8. }
  9. copy {
  10. from "buildEnv/${type}"
  11. into "${rootDir}/app"
  12. include "**/*.config"
  13. }
  14. }

切换 RPC 数据加密配置

portal-app 的 gradle 中配置如下内容:

  1. //配置 RPC 数据加密开发环境,将配置文件拷贝到 assets 资源目录下
  2. def setNetConfigEnv(String type){
  3. copy {
  4. from "buildEnv/${type}/mpaas_netconfig.properties"
  5. into "${rootDir}/app/src/main/assets"
  6. }
  7. }

切换 H5 容器配置

portal-app 的 gradle 中配置如下内容:

  1. //配置离线包开发环境,将配置文件拷贝到 assets 资源目录下
  2. def setNebulaEnv(String type){
  3. copy {
  4. from "buildEnv/${type}/custom_config.json"
  5. into "${rootDir}/app/src/main/assets/config"
  6. }
  7. }

切换代码配置

切换离线包验签公钥

  1. 将离线包验签密钥写入H5 容器配置custom_config.json 文件中:
    1. [
    2. {
    3. "value": "YES",
    4. "key": "h5_shouldverifyapp"
    5. },
    6. {
    7. "value": "your public key",
    8. "key": "h5_shouldverifyapp_pubkey"
    9. }
    10. ]
  2. 通过读取 H5 容器配置 获取离线包验签公钥,通过切换 H5 容器配置 实现切换离线包验签公钥:

    1. /**
    2. * 根据H5容器配置文件解析离线包验签公钥
    3. * @return 离线包验签公钥
    4. */
    5. public String getAppVerificationPubkey(){
    6. String configStr = getFromAssets("config/custom_config.json");
    7. JSONArray jsonArray = JSON.parseArray(configStr);
    8. if(jsonArray != null && jsonArray.size() > 0){
    9. for (int i = 0; i < jsonArray.size(); i++) {
    10. JSONObject jsonObject = jsonArray.getJSONObject(i);
    11. String key = jsonObject.getString("key");
    12. if(key.equals("h5_shouldverifyapp_pubkey")){
    13. String value = jsonObject.getString("value");
    14. return value;
    15. }
    16. }
    17. }
    18. return null;
    19. }
    20. /**
    21. * 获取 portal assets 目录文件内容
    22. * @param fileName 文件名称
    23. * @return 文件内容
    24. */
    25. public String getFromAssets(String fileName){
    26. try {
    27. MicroApplicationContext context = MPFramework.getMicroApplicationContext();
    28. InputStreamReader inputReader = new InputStreamReader(context.getApplicationContext().getResources().getAssets().open(fileName));
    29. BufferedReader bufReader = new BufferedReader(inputReader);
    30. String line= "";
    31. String Result= "";
    32. while((line = bufReader.readLine()) != null)
    33. Result += line;
    34. return Result;
    35. } catch (Exception e) {
    36. e.printStackTrace();
    37. }
    38. return null;
    39. }
  3. 设置离线包验签公钥:
    1. String pubkey = getAppVerificationPubkey();
    2. if(!TextUtils.isEmpty(pubkey)){
    3. MPNebula.enableAppVerification(pubkey);
    4. }

切换 UC SDK key

UC SDK key 存放在 AndroidManifest.xml 中:

  1. <application>
  2. ...
  3. <meta-data android:name="UCSDKAppKey" android:value="${GRADLE_APP_UCKEY}"/>
  4. ...
  5. </application>

可以通过在 portal-app 的 gradle 中配置 manifestPlaceholders 进行切换:

  1. buildTypes {
  2. release {
  3. manifestPlaceholders = [GRADLE_APP_UCKEY : 'your release uc key']
  4. ...
  5. }
  6. debug {
  7. ...
  8. manifestPlaceholders = [GRADLE_APP_UCKEY : 'your debug uc key']
  9. ...
  10. }
  11. }

切换开发环境

portal-app 的 gradle 中配置,通过调用该方法,传入环境参数实现自动切换:

  1. // 根据环境类型切换开发环境
  2. // type = dev/test/uat/prod 可根据配置目录自由扩展
  3. def switchBuildEnv(String type){
  4. setAppConfigEnv(type)
  5. if(file("buildEnv/${type}/custom_config.json").exists()){
  6. setNebulaEnv(type)
  7. }
  8. if(file("buildEnv/${type}/mpaas_netconfig.properties").exists()){
  9. setNetConfigEnv(type)
  10. }
  11. }

代码示例

portal-app 的 gradle 中调用切换方法:

  1. buildTypes {
  2. // 切换开发环境
  3. switchBuildEnv('prod')
  4. release {
  5. ...
  6. }
  7. debug {
  8. ...
  9. }
  10. }

点击这里 下载代码示例。