Coder 投稿 | mPaaS 的多版本接入(Android)

本文作者:mPaaS 用户「Q-Coder」
同时欢迎更多的开发者向 mPaaS 投稿
原文:blog.csdn.net/yqq577/article/details/116801705
前言 对于 mPaaS 的常规接入,这里就不赘述了。
因为比较简单,根据官方文档就可以完美接入了。或者可以在 Android Studio 中,接入 mPaaS 插件,这样可以更快、更方便的接入。
经历完上面的接入步骤,我以为看到了胜利的曙光。突然,CTO 跟 iOS 的同事说:
“Android 既然接好了,那 iOS 这边也接 mPaaS,不过 iOS 的难点是,公司项目采用了在一个 TARGETS 下可以打出多个应用,但一个 TARGETS 只能配置一个 mPaaS 的 config 文件。”(编者注:该问题可以通过手动替换配置文件和图片的方式解决,详情可钉钉搜索“33214637”咨询技术支持同学)
迟疑三秒后,我才发现 Android 当时我搭架构的时候,也是为了能提高开发效率,采用了相似的方式——Build 变体。
就此,进入了本文解决“如何在多版本的模式下,接入 mPaaS”问题的【困难模式】。
困难模式 经过一系列的尝试(已经记不清耗时多久,反正给我造成了一定的压力),发现只需要在不同的 Build Variant(不同版本)下导入不同的 App 配置即可。
但是,这样很麻烦,每次打不同的 App 的时候,就要重新导入一次,这着实有点鸡肋。
然后,结合 mPaaS 官方的一个 多环境下配置 mPaaS 的文档。在 gradle 下动态配置不同 App 的配置文件。
重头戏来了--官方 demo 中主 module 下的 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" } }

这里贴出上面demo的目录结构,便于理解代码
Coder 投稿 | mPaaS 的多版本接入(Android)
文章图片

看完上面的代码,思路为:
  • 首先检查是否存在以.config为后缀的文件,如果有则删除。
  • 然后将新的配置文件copy到指定位置。
但是 demo 中,并不是动态的,因为 setAppConfigEnv('dev'),其实还是在代码中写死了。
所以,我们只需要动态的拿到Flavor的值就可以了。
def getCurrentFlavor() { Gradle gradle = getGradle() String tskReqStr = gradle.getStartParameter().getTaskRequests().toString() Pattern pattern if (tskReqStr.contains("assemble")) pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")//Release和Debug这个具体根据自己的环境名进行填写 else pattern = Pattern.compile("generate(\\w+)(Release|Debug)")Matcher matcher = pattern.matcher(tskReqStr)if (matcher.find()) return matcher.group(1).toLowerCase() else { println "NO MATCH FOUND" return "" } }

最后只需要在 buildTypes 像下面那样调用就行了
buildTypes { setAppConfigEnv(getCurrentFlavor()) ... }

万事大吉!
经历了这次事件,我觉得接下来要开始学习 Gradle 这个东西。熟悉 Gradle 对于后面的需求就能更好的应付了。
核心的内容都在上面了,如果还有一些细节上存在疑问。可以留言或者私信,我将很乐意为您解答。
笔记 在上面的历程中,用到了可能在多版本下,常用的方法。记录下来
  1. 如何获取当前 Flavor
def getCurrentFlavor() { Gradle gradle = getGradle() StringtskReqStr = gradle.getStartParameter().getTaskRequests().toString()Pattern pattern; if( tskReqStr.contains( "assemble" ) ) pattern = Pattern.compile("assemble(\\w+)(Release|Debug)") else pattern = Pattern.compile("generate(\\w+)(Release|Debug)")Matcher matcher = pattern.matcher( tskReqStr )if( matcher.find() ) return matcher.group(1).toLowerCase() else { println "NO MATCH FOUND" return ""; } }

  1. 如何获取当前 Flavor 的 applicationId
def getCurrentApplicationId() { def currFlavor = getCurrentFlavor()def outStr = '' android.productFlavors.all{ flavor ->if( flavor.name==currFlavor ) outStr=flavor.applicationId }return outStr }

年末拉个票 mPaaS 正在参加「2021稀土掘金年度人气创作团队榜单」,欢迎广大 mPaaS Coder 扫描下方二维码,为 mPaaS 投出您宝贵的一票。
Coder 投稿 | mPaaS 的多版本接入(Android)
文章图片

【Coder 投稿 | mPaaS 的多版本接入(Android)】Coder 投稿 | mPaaS 的多版本接入(Android)
文章图片

Coder 投稿 | mPaaS 的多版本接入(Android)
文章图片

    推荐阅读