1. 程式人生 > 其它 >Coder 投稿 | mPaaS 的多版本接入(Android)

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

如何在多版本的模式下,接入mPaaS

本文作者: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 投出您寶貴的一票。


App 開發、測試、運營、運維雲到端一站式解決方案