Gradle自動打包APK上傳到蒲公英

語言: CN / TW / HK

一起養成寫作習慣!這是我參與「掘金日新計劃 · 4 月更文挑戰」的第5天,點擊查看活動詳情

前言

目前所在的公司,沒有搭建jekins等自動構建平台,導致每次測試的時候,都需要開發人員手動將debug、release等環境的包手動上傳到蒲公英上面,而且因為包名需要保持一致的原因,甚至需要多個蒲公英賬號之間來回切換才能完成這項工作,在這個過程中,難免會耽誤大量切換時間,以及減少開發效率。甚至在這個過程中,很有可能會因為某些原因導致上傳錯誤。這對於整個團隊之間的效率是有極大影響的。 因此,將這個過程轉成自動構建的方式也就有極大的意義,在無形之間也將開發人員的效率進行了一個提高。

代碼

通過gradle的task可以實現這個功能,當然也可以使用plugin的方式來進行集成、以及多樣化配置,但考慮到同事之間可能對這塊不是都很熟悉,目前我所展示的方式是使用新建一個gradle文件的方式來進行配置 ``` import groovy.json.JsonSlurper

/* * 上傳apk到蒲公英 / def uploadApk(boolean isRelease) { //查找上傳的apk文件 def apkPath = "" if (isRelease) { apkPath = "app/build/intermediates/apk/release" } else { apkPath = "app/build/intermediates/apk/debug" }

def apkDir = new File(apkPath)
if (!apkDir.exists()) {
    throw new RuntimeException("apk output path not exists!")
}

def apk = null
for (int i = apkDir.listFiles().length - 1; i >= 0; i--) {
    File file = apkDir.listFiles()[i]
    if (file.name.endsWith(".apk")) {
        apk = file
        break
    }
}
if (apk == null) {
    throw new RuntimeException("apk file not exists!")
}

println "*************** start upload file ***************"

def twoHyphens = "--"
def boundary = "*********"
def end = "\r\n"

//模擬表單上傳 multipart/form-data
def conn = new URL("http://www.pgyer.com/apiv2/app/upload").openConnection()
conn.setRequestMethod('POST')
conn.setRequestProperty("Connection", "Keep-Alive")
conn.setRequestProperty("Charset", "UTF-8")
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary)
conn.setDoInput(true)
conn.setDoOutput(true)

def apiKey = ""
if (isRelease) {
    apiKey = "正式環境apikey"
} else {
    apiKey = "非正式環境apikey"
}

//添加參數:_api_key
def sb = new StringBuilder()
sb.append(twoHyphens).append(boundary).append(end)
sb.append("Content-Disposition: form-data; name=_api_key")
sb.append(end).append(end)
sb.append(apiKey).append(end)

//添加參數:buildUpdateDescription 更新日誌,取值git
sb.append(twoHyphens).append(boundary).append(end)
sb.append("Content-Disposition: form-data; name=buildUpdateDescription")
sb.append(end).append(end)
sb.append(getGitVersionInfo()).append(end)

//添加參數:buildInstallType 設置安裝方式,1為公開方式安裝,具體的安裝類型參考蒲公英api網址
sb.append(twoHyphens).append(boundary).append(end)
sb.append("Content-Disposition: form-data; name=buildInstallType")
sb.append(end).append(end)
sb.append(1).append(end)

//添加參數:buildPassword 設置密碼

// sb.append(twoHyphens).append(boundary).append(end) // sb.append("Content-Disposition: form-data; name=buildPassword") // sb.append(end).append(end) // sb.append("1024").append(end)

//添加參數file: 需要上傳的apk文件
sb.append(twoHyphens).append(boundary).append(end)
sb.append("Content-Disposition: form-data; name=file;filename=").append(apk.getName())
sb.append(end).append(end)

def dos = new DataOutputStream(conn.getOutputStream())
dos.writeBytes(sb.toString())
dos.flush()
sb.delete(0, sb.length())

def fis = new FileInputStream(apk)
byte[] bf = new byte[8192]
int len
while ((len = fis.read(bf)) != -1) {
    dos.write(bf, 0, len)
}
sb.append(end)
sb.append(twoHyphens).append(boundary).append(end)
dos.writeBytes(sb.toString())

dos.flush()
fis.close()
dos.close()
conn.connect()

def text = conn.getContent().text
def resp = new JsonSlurper().parseText(text)


println text
println "*************** upload finish ***************"

if (resp.code != 0) {
    throw new RuntimeException(resp.message)
}

//瀏覽器中打開短連接
def url = "http://www.pgyer.com/" + resp.data.buildShortcutUrl
print("上傳成功,應用鏈接:" + url)

}

static def getGitVersionInfo() { //獲取最新commit id def commitId = 'git rev-parse HEAD'.execute().text.trim() //獲取一條日誌 def logTxt = 'git log - --pretty=format:“%s” ' + commitId def log = logTxt.execute().text.trim() return log }

//打包測試環境apk 上傳蒲公英 發送郵件功能使用蒲公英自帶的郵件功能 task uploadReleaseApk(group: "upload") { dependsOn("assembleRelease")

doLast {
    uploadApk(true)
}

}

//打包測試環境apk 上傳蒲公英 發送郵件功能使用蒲公英自帶的郵件功能 task uploadDebugApk(group: "upload") { dependsOn("assembleDebug") doLast { uploadApk(false) } } ```

使用

在App的build.gradle中加入 apply from: "../uploadReleaseApk.gradle"

image.png

總結

gradle是一個很強大的構建工具,它有很多的功能可以給開發提供很多的便利性,目前我對它的瞭解還不是很多,但是也從中學習到了很多優秀的功能。