時間是最寶貴的財富,咱們的時間得用在刀刃上。html
在文章 使用 Gradle 對應用進行個性化定製 中,咱們可以針對一個應用的正式服、測試服、超管服等其餘版本,進行個性化定製。因此常常會有測試跑過來講,幫我打個測試服的包吧、幫我打個正式服的包吧、幫我打個超管服的包吧。我打你一臉包😤😤🤯。android
咱們的目標是一行命令完成:json
直接使用蒲公英的上傳 API ,在 Gradle 中封裝以下方法:api
private def uploadPGY(String filePath) {
def stdout = new ByteArrayOutputStream()
exec {
executable = 'curl'
args = ['-F', "file=@${filePath}", '-F', "_api_key=${rootProject.ext.pgy["apiKey"]}", rootProject.ext.pgy["uploadUrl"]]
standardOutput = stdout
}
String output = stdout.toString()
def parsedJson = new groovy.json.JsonSlurper().parseText(output)
println parsedJson.data.buildQRCodeURL
println "版本號:" + parsedJson.data.buildVersion
}
複製代碼
好了,執行以上方法就能夠實現咱們上面的兩個目標啦。看不懂的咱們繼續,包教包會。安全
curl 是一種命令行工具,做用是發出網絡請求,而後獲得和提取數據,顯示在"標準輸出"(stdout)上面。微信
咱們使用 curl 命令來調用蒲公英的接口上傳 apk 文件。將蒲公英的 apiKey
和 uploadUrl
放在 config.gradle 中進行統一的管理。網絡
ext{
pgy = [apiKey : "xxxxxxxxxxx",
uploadUrl: "https://www.pgyer.com/apiv2/app/upload"]
}
複製代碼
stdout
變量是用來獲取網絡請求返回的數據流,咱們解析成 JSON 對象後打印出二維碼地址和版本號信息。若是你還想上傳或者輸出更多信息請查看蒲公英的上傳 API 。app
這個時候你們要問了,apk 的文件路徑從哪來呢?dom
咱們有正式環境、測試環境和超管環境,而且每一個環境生成的 apk 文件名也不一樣,那麼咱們怎麼獲取到 apk 文件的路徑呢?curl
在config.gradle
中增長版本信息
ext{
pgy = [apiKey : "xxxxxxxxxxx",
uploadUrl: "https://www.pgyer.com/apiv2/app/upload"
]
android = [compileSdkVersion: 28,
buildToolsVersion: "28.0.3",
minSdkVersion : 16,
targetSdkVersion : 28,
versionCode : 1,
versionName : "1.0.0"
]
}
複製代碼
在根目錄的 build.gradle
中增長獲取 getApkName
方法
def getTestVersionName(String suffix) {
def testVersion = "001"
if (suffix == null || suffix.isEmpty()) {
return String.format("%s.%s", rootProject.ext.android["versionName"], testVersion)
} else {
return String.format("%s.%s.%s", rootProject.ext.android["versionName"], testVersion, suffix)
}
}
def getApkName(String versionName) {
return String.format("我是一個包-v%s.apk", versionName)
}
複製代碼
在 application 工程的 build.gradle
中修改 apk 文件名
productFlavors {
offline {
buildConfigField "String", "DOMAIN_NAME", "\"https://offline.domain.com/\""
versionName getTestVersionName("offline") //修改 versionName
}
online {
buildConfigField "String", "DOMAIN_NAME", "\"https://online.domain.com/\""
versionName rootProject.ext.android["versionName"]
}
admin {
buildConfigField "String", "DOMAIN_NAME", "\"https://admin.domain.com/\""
versionName versionName getTestVersionName("管理員") //修改 versionName
}
}
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = getApkName(variant.versionName)
}
}
複製代碼
def offlineFile = "${projectDir.absolutePath}/build/outputs/apk/offline/release/${getApkName(getTestVersionName("offline"))}"
def adminFile = "${projectDir.absolutePath}/build/outputs/apk/admin/release/${getApkName(getTestVersionName("管理員"))}"
def onlineFile = "${projectDir.absolutePath}/build/outputs/apk/online/release/${getApkName(rootProject.ext.android["versionName"])}"
/** * 執行 「uploadOfflineApk」 命令自動打測試服包,並上傳到蒲公英 */
task uploadOfflineApk(dependsOn: 'assembleOfflineRelease') {
group = "publish"
doLast {
uploadPGY(offlineFile)
}
}
/** * 執行 「uploadOnlineApk」 命令自動打正式服包,並上傳到蒲公英 */
task uploadOnlineApk(dependsOn: 'assembleOnlineRelease') {
group = "publish"
doLast {
uploadPGY(onlineFile)
}
}
/** * 執行 「uploadAdminApk」 命令自動打超管服包,並上傳到蒲公英 */
task uploadAdminApk(dependsOn: 'assembleAdminRelease') {
group = "publish"
doLast {
uploadPGY(adminFile)
}
}
複製代碼
一行命令打3個包上傳: ./gradlew uploadOfflineApk uploadOnlineApk uploadAdminApk
咱們的超管包是須要發給運營人員去使用的,防止泄露致使的安全風險,咱們但願對超管包先進行加當然後再上傳到蒲公英。