携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 2 天,点击查看活动详情
0.前言
mPaas,是个什么东西?是一组需求的解决方案。当时因需要做混合开发( H5 离线包 ),考虑将其接入项目当中。虽然最后并未采用此方案,但是其中的一些有价值的东西,还是值得我们记录和学习的。
1.业务背景
对于 mPaas 的常规接入,这里就不赘述了。因为比较简单,根据 官方文档 就可以完美接入了。(可以在 Android Studio 中,接入 mPaas 插件,这样可以更快,更方便的接入)
经历完上面的步骤,我自认为,“混合开发也不过如此嘛”。当我跟领导汇报完,我的进度之后,领导转头跟 iOS 的同事说:“Android 既然接好了,那 iOS 这边也接 mPaas,不过 iOS 这边存在坑,就是公司项目采用了在一个 TARGETS 下可以打出多个应用。但是一个 TARGETS 只能配置一个 mPaas 的 config 文件。”
我迟疑一会,突然想起,当时我在搭 Android 架构的时候,为了能提高开发效率,采用了相似的方式。( Build 变体 )。也因此将接入 mPaas 的难度升级到了【困难模式】。
2.具体操作
这里主要解决如何在 多版本 的模式下,接入 mPaas。
经过一系列的尝试(已经记不清耗时多久,尝试了多少方案,只记得那段时间,做梦都在敲代码),发现只需要在不同的 Build Variant(不同版本) 下导入不同的 App配置 即可。但是,这样很麻烦,就是每次打不同的 App 的 apk 的时候,就要重新导入一次,这着实有点鸡肋。
在扒各种官方文档后,看到了 多环境下配置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())
...
}
万事大吉。
经历了这次事件,我觉得接下来要开始学习 Gradle 这个东西。熟悉 Gradle 对于后面的需求就能更好的应付了。
核心的内容都在上面了,如果还有一些细节上存在疑问。可以留言或者私信我,我将很乐意为您解答。
3.笔记
其中用到了在多版本下,常用的方法。记录下来
如何获取当前 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
}