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().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())
...
}
万事大吉。(其实,最后还是弃坑了,放弃了接入mPaas。我太年轻了,把握不住)
经历了这次事件,我觉得接下来要开始学习 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-多版本接入篇的主要内容,如果未能解决你的问题,请参考以下文章