頻繁的打包構建,時不時釋出更新,是否總防不勝防的擾亂你的工作(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。
打包開始,伺服器提供一個簡單的頁面,使用者選擇輸入需要打包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,但是當你越發深入的撩解之後,也許你連女朋友的電話都不想接了,前提是···