写点什么

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

  • 2021 年 12 月 24 日
  • 本文字数:1921 字

    阅读完需:约 6 分钟

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 的目录结构,便于理解代码



看完上面的代码,思路为:


  • 首先检查是否存在以.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()    String  tskReqStr = 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 投出您宝贵的一票。




发布于: 22 小时前
用户头像

App 开发、测试、运营及运维一站式解决方案 2020.08.14 加入

源于蚂蚁集团,致力于提供高效、灵活、稳定的移动研发、管理平台。

评论

发布
暂无评论
Coder 投稿 | mPaaS 的多版本接入(Android)