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

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

涉及 mPaaS 的改动

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

  • mPaaS 项目配置:项⽬中 .config 配置文件 Ant-mpaas-xxx-Android.config,配置在 portalapp ⽬录下,用于存放应用推送服务地址、网关服务地址等。详情参见 在控制台创建应用

  • RPC 数据加密配置:项目中 mpaas_netconfig.properties 配置⽂件,配置在 portalassets ⽬录下,⽤于存放 RPC 数据加密方式、加密公钥等。详情参见 数据加密 > Android 配置

  • H5 容器配置:项⽬中 custom_config.json 配置文件,配置在 portalassets 目录下,⽤于存放离线包验签开关、沉浸标题栏开关等。详情参见 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"
    }
}

切换代码配置

切换离线包验签公钥

  1. 将离线包验签密钥写入 H5 容器配置custom_config.json 文件中:

    [
    {
     "value": "YES",
     "key": "h5_shouldverifyapp"
    },
    {
     "value": "your public key",
     "key": "h5_shouldverifyapp_pubkey"
    }
    ]
  2. 通过读取 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;
         }
  3. 设置离线包验签公钥:

     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 {
        ...
    }
}

点击这里 下载代码示例。