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 對於後面的需求就能更好的應付了。
核心的內容都在上面了,如果還有一些細節上存在疑問。可以留言或者私信,我將很樂意為您解答。
筆記
在上面的歷程中,用到了可能在多版本下,常用的方法。記錄下來
- 如何獲取當前 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
}
年末拉個票
mPaaS 正在參加「2021稀土掘金年度人氣創作團隊榜單」,歡迎廣大 mPaaS Coder 掃描下方二維碼,為 mPaaS 投出您寶貴的一票。
App 開發、測試、運營、運維雲到端一站式解決方案