每次發(fā)測試包,需要調(diào)用android打包命令,然后在打開瀏覽器上次到蒲公英平臺(tái),給測試下載。雖然每次只需要幾分鐘,但是每次幾分鐘太浪費(fèi)時(shí)間了。做為程序員的我,懶才能完美形容。既然是重復(fù)操作,那為什么不寫個(gè)腳本打包完成后自動(dòng)上傳到對(duì)應(yīng)的平臺(tái)呢?
說干就干,翻閱蒲公英平臺(tái)的接口文檔,發(fā)現(xiàn)正好有上傳apk的api
首先就是用什么方式上傳,由于目前android大多使用okhttp作為網(wǎng)絡(luò)請求,所以在gradle當(dāng)然使用okhttp作為網(wǎng)絡(luò)請求庫洛,蒲公英接口返回的格式是json當(dāng)然會(huì)用到google官方的gson作為json解析,然后就有了如下配置,在項(xiàng)目根目錄的build.gradle中添加下面依賴
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
classpath "com.squareup.okhttp3:okhttp:3.14.2"
classpath "com.google.code.gson:gson:2.8.5"
}
}
- 然后在app所在的build.gradle文件中開始寫我們的自動(dòng)上傳腳本洛,開心愉快的使用開始了
android{
// 注意這個(gè)task后面的名字哦,后面會(huì)用的到,隨便寫啥都可以的
task assembleUat2UploadPgyer() {
dependsOn "assembleRelease" // 這里寫打包的腳本名稱,可以是發(fā)布版本,debug版本,或者是自定義的版本
group "upload2Pgyer" // 給我們這個(gè)腳本取個(gè)名字,方便找到哦,不然都跑到other里面了,太難找了
doFirst {
logger.log(LogLevel.ERROR, "開始執(zhí)行apk上傳蒲公英操作")
}
doLast {
applicationVariants.all {
it.outputs.each { out ->
def outputFile = out.outputFile
if (outputFile != null && outputFile.name == 'app-release.apk') { // 這里的app-release要根據(jù)上面配置的assembleXXX來寫哦
logger.log(LogLevel.ERROR, "apk 所在的磁盤絕對(duì)路徑 : ${outputFile.absolutePath}")
// 還是那個(gè)字懶,發(fā)版本不想去修改版本號(hào),所以就用git提交的次數(shù)作為版本號(hào)了
def versionCode = 'git rev-list HEAD --first-parent --count'.execute().text.trim().toInteger()
logger.log(LogLevel.ERROR, "app 當(dāng)前準(zhǔn)備傳版本號(hào):${rootProject.ext.android.versionName}.${versionCode}")
def clientBuilder = new OkHttpClient.Builder()
clientBuilder.connectTimeout(10, TimeUnit.SECONDS)
clientBuilder.readTimeout(60, TimeUnit.SECONDS)
OkHttpClient client = clientBuilder.build()
def fileBody = RequestBody.create(MediaType.parse("multipart/form-data"), new File(outputFile.absolutePath))
def bodyBuilder = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("_api_key", "蒲公英的key")
.addFormDataPart("file", outputFile.name, fileBody)
.addFormDataPart("buildInstallType", "1")
// .....后面還可以添加很多參數(shù),可以去看蒲公英的文檔
def request = new Request.Builder()
.url("https://www.pgyer.com/apiv2/app/upload")
.post(bodyBuilder.build())
.build()
logger.log(LogLevel.ERROR, "-----------開始上傳-------------")
def response = client.newCall(request).execute()
if (response == null || response.body() == null) {
logger.log(LogLevel.ERROR, "蒲公英上傳結(jié)果失敗")
return null
}
def json = response.body().string()
logger.log(LogLevel.ERROR, "蒲公英上傳結(jié)果:${json}")
def data = new Gson().fromJson(json, Map.class).data
logger.log(LogLevel.ERROR, "蒲公英安裝二維碼地址:${data.buildQRCodeURL}")
logger.log(LogLevel.ERROR, "蒲公英上傳成功的版本號(hào):${data.buildVersion}.${data.buildVersionNo}")
logger.log(LogLevel.ERROR, "蒲公英下載地址:https://www.pgyer.com/${data.buildShortcutUrl}")
response.close()
logger.log(LogLevel.ERROR, "-----------完成上傳-------------")
}
}
}
}
}
}
到此我們的自動(dòng)上次腳本就完成啦,不對(duì),還有一個(gè)重要的使用,忘記導(dǎo)包了,O(∩_∩)O哈哈~
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody
import okhttp3.MediaType
import java.util.concurrent.TimeUnit
import com.google.gson.Gson
這樣才算完成哦
-
看看最后的效果洛
在android studio Gradle工具欄中就可以看見我們自定義的一個(gè)task,每次需要發(fā)布測試版本,就瘋狂的點(diǎn)擊這個(gè)就好啦,一切交給我們腳本吧
-
腳本執(zhí)行完后就會(huì)在控制臺(tái)輸出對(duì)應(yīng)的下載地址哦,復(fù)制粘貼發(fā)給測試,輕松加愉快的完成了版本發(fā)布
哈哈,其實(shí)可以把這段腳本抽取出來的,懶才是我的天性,所以就沒有抽取,能夠完成功能的腳本才是好腳本,所以就沒有這么多講究了哦
emmmmm,其實(shí)這個(gè)腳本還有一個(gè)問題,就是在上傳的時(shí)候沒有進(jìn)度顯示。由于使用了okhttp想要獲取上傳的進(jìn)度,需要自定義寫東西,我太懶了,不想搞了,還是那個(gè)原則,能用的腳本就是好腳本。有興趣的小伙伴可以加入進(jìn)度條哦

