讓Gradle放飛你的apk構建

戀貓de小郭發表於2019-03-04

 頻繁的打包構建,時不時釋出更新,是否總防不勝防的擾亂你的工作(tou lan)狀態?(◐‿◑)

 這是一篇簡“短”解決方法,讓Apk的構建引數完全由外界決定。通過外部配置版本資訊、伺服器地址、渠道、編譯sdk版本等,直接構建apk,無需開發人員再次修改提交gradle等檔案,解放你的雙手吧。

本文雖短,節操滿滿

 以上場景,其實來源於最近的日常需求。因為專案的構建、測試、釋出,都是在固定的打包伺服器完成,也就是遠端打包,然後生成二維碼下載。

 然而很多時候,服務端人員、測試或者產品人員,時不時需要構建一些定製化的apk,例如不同的伺服器地址、不同的編譯sdk版本、不同的版本號資訊和so過濾等等。剛開始由於忙(lan)的緣故,都是有需要就修改提交打包,時間長後就十分影響工作(xin qing)了(╯‵□′)╯︵┻━┻。

 那麼說幹就要上正面,既然gradle本來就採用了 Groovy 作為語言,而且預設匯入了java的基礎類,Groovy又支援Java語言的特性···天作之合啊有木有,不擼不是猴啊。

 Gradle中可簡單分兩步實現:

  • 1、定義方法,通過Java的HttpURLConnection,簡單獲取使用者配置好的引數資訊,通過Groovy 的JsonSlurper 解析資料。
熟悉又簡單的寫法╮(╯▽╰)╭
  • 2、通過伺服器返回的配置資訊,填充到gradle打包需要的引數中,再打包出對應的apk。
根據引數匯入,so easy

 打包開始,伺服器提供一個簡單的頁面,使用者選擇輸入需要打包apk的版本號、版本名,渠道、伺服器地址等資訊,然後執行gradlew打包。gradle指令碼會先請求當前的配置資訊,填充直接打包所需的apk,而從中解放出來你(wo),終於可以安心工作(tou lan),然後為所欲為了(-_^)。

 當然,這並不是一定最好的實現場景,但是對我而言,在目前的條件下,確實最合適不過了,簡單便捷的解決思路之一。本文也不是什麼高深的東西,只算是一次簡單的解決記錄吧,畢竟剛開始還想著,用shell指令碼去對打包好的apk坐二次處理( ̄^ ̄)


//匯入groovy的Json解析
import groovy.json.JsonSlurper
def getTenantVersionName(def apkName) {
    //請求的打包資訊的伺服器地址
    def urlString = "http://xxxxxx?appName=${apkName}"
    def url = new URL(urlString)
    def packageInfoResult = null
    HttpURLConnection conn = (HttpURLConnection) url.openConnection()
    conn.setRequestMethod(`GET`)
    conn.setConnectTimeout(5000)
    int code = conn.getResponseCode()
    if(code == 200) {
        //請求成功
        InputStream is = conn.getInputStream()
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024]
        int len = 0
        while ((len = is.read(buffer)) != -1) {
            baos.write(buffer, 0, len)
        }
        baos.close()
        is.close()
        //轉換資料
        byte[] byteArray = baos.toByteArray()
        def result = new String(byteArray)
        def JsonSlurper = new JsonSlurper()
        packageInfoResult = JsonSlurper.parseText(result)
    }
    return packageInfoResult
}
複製程式碼

最後

 也許日常開發中,你只是普通的配置gradle,但是當你越發深入的撩解之後,也許你連女朋友的電話都不想接了,前提是···

讓Gradle放飛你的apk構建

相關文章