# mPaaS_switch_dev_env **Repository Path**: android60/mPaaS_switch_dev_env ## Basic Information - **Project Name**: mPaaS_switch_dev_env - **Description**: mPaaS, 一键切换开发环境配置,比如:dev/test/uat/prod - **Primary Language**: Android - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-02-12 - **Last Updated**: 2022-01-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # mPaaS Android工程如何在多套开发环境间切换 [toc] ## 问题描述 ### 描述 mPaaS 60基线,提供多套开发环境间切换的一种解决方案,帮助开发者在多套开发环境下(比如:开发dev/测试test/体验uat/线上prod)方便、快速进行切换。 ### 涉及到的改动 对于mPaaS开发者,在切换开发环境的过程中,涉及到以下配置文件的改动: * **mPaaS项目配置**:项目中.config配置文件(Ant-mpaas-xxx-Android.config),配置在portal的app目录下,用于存放应用推送服务地址、网关服务地址等;参考文档: * **rpc数据加密配置**:项目中mpaas_netconfig.properties配置文件,配置在portal的assets目录下,用于存放rpc数据加密方式、加密公钥等,参见文档: * **H5容器配置**:项目中custom_config.json配置文件,配置在portal的assets目录下,用于存放离线包验签开关、沉浸标题栏开关等;参见文档: * **离线包验签公钥**:项目中利用公钥对离线包进行解密,配置在代码中,通过Nebula组件进行设置;参见文档: * **UCSDK key**:项目中使用UC内核时需要申请,配置在AndroidManifest文件中;参见文档: ### 现状 当我们切换开发环境时,需要将项目中涉及到的上述配置的地方进行手动替换或者修改,过程繁琐且容易出错。如何解决这个问题?下面开始介绍通过在gradle中简单配置实现自动切换开发环境。 ## 解决方案 切换开发环境需要修改的这些配置有两种: * 纯配置文件(mPaaS项目配置、rpc数据加密配置、H5容器配置文件) * 代码中的配置(离线包验签公钥、UCSDK key) 对于纯配置文件,我们可以再编译期通过gradle脚本进行配置文件替换; 对于代码中的配置,我们可以将其写在配置文件中,通过读取配置文件进行操作; 下面来详细介绍操作步骤 ### 配置切换的目录和文件 * 在portal-app下,根据项目需求新建各个开发环境目录,存放不同环境的配置文件; * 将各个环境的**mPaaS项目配置**拷贝到对应环境的目录下; * 如果有**rpc数据加密配置**需要切换,将mpaas_netconfig.properties拷贝对应目录; * 如果有**H5容器配置**需要切换,将custom_config.json拷贝对应目录;如下图: ![](files/1.png) ### 切换 纯配置文件 #### 切换 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); } ``` #### 切换 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'] ... } } ``` ### 切换 开发环境 #### 根据环境类型切换开发环境 在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 { ... } } ``` [具体配置参考portal-app的gradle源文件](auto_config_demo/app/build.gradle)