Android-混合开发mPaas-多版本接入篇

Posted Q-CODER

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-混合开发mPaas-多版本接入篇相关的知识,希望对你有一定的参考价值。

对于 mPaas 的常规接入,这里就不赘述了。因为比较简单,根据 官方文档 就可以完美接入了。(可以在 android Studio 中,接入 mPaas 插件,这样可以更快,更方便的接入)

经历完上面的步骤,我以为看到了胜利的曙光。突然,CTO 跟 ios 的同事说:“Android 既然接好了,那 iOS 这边也接 mPaas,不过 iOS 这边存在坑,就是公司项目采用了在一个 TARGETS 下可以打出多个应用。但是一个 TARGETS 只能配置一个 mPaas 的 config 文件。” 迟疑3秒后,我才发现Android 当时我搭架构的时候,也是为了能提高开发效率,采用了相似的方式。( Build 变体 )就此,进入了本篇的【困难模式】打怪升级。


本篇主要解决 如何在 多版本 的模式下,接入 mPaas。

经过一系列的尝试(已经记不清耗时多久,反正给我造成了一定的压力),发现只需要在不同的 Build Variant(不同版本) 下导入不同的 App配置 即可。但是,这样很麻烦,就是每次打不同的 App 的时候,就要重新导入一次,这着实有点鸡肋。

然后结合mPaas官方的一个 多环境下配置mPaas的 文档。(关于 多版本,多环境,多渠道打包,可以看我另一篇文章【Android】手把手带你进入android打包的多版本,多环境,多渠道的踩坑之旅)在 gradle 下动态配置不同 App 的配置文件。

重头戏来了--官方demo中主 module 下的 gradle

//配置mPaaS App 开发环境,将 .config 配置文件拷贝到主Module下
def setAppConfigEnv(String type)

    //先把原有的配置文件删除
    File configFile = file("$rootDir/app").listFiles().findFile f ->
        f.name.endsWith(".config")
    
    if(configFile != null && configFile.exists())
        delete(configFile)
    
   //将不同目录下的文件,拷贝到壳项目下,用于打包
    copy 
        from "buildEnv/$type"
        into "$rootDir/app"
        include "**/*.config"
    

这里贴出上面demo的目录结构,便于理解代码

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

  1. 首先检查是否存在以.config为后缀的文件,如果有则删除。
  2. 然后将新的配置文件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 对于后面的需求就能更好的应付了。


核心的内容都在上面了,如果还有一些细节上存在疑问。可以留言或者私信我,我将很乐意为您解答。

其中用到了可能在多版本下,常用的方法。记录下来

如何获取当前 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 "";
    

如何获取当前 Flavor 的 applicationId

def getCurrentApplicationId() 
    def currFlavor = getCurrentFlavor()

    def outStr = ''
    android.productFlavors.all flavor ->

        if( flavor.name==currFlavor )
            outStr=flavor.applicationId
    

    return outStr

以上是关于Android-混合开发mPaas-多版本接入篇的主要内容,如果未能解决你的问题,请参考以下文章

Flutter混合开发之FlutterFragment

kotlin/java混合开发接入ARouter遇到的问题Compiler An exception is encountered, [These no module name, at ‘build.

androd H5混合开发 当无网络下,android怎么加载H5界面

Android混合开发该怎么搞

Flutter混合开发模式下的代码调试

Android推送接入总结--个推版