本文最后更新于 862 天前,其中的信息可能已经有所发展或是发生改变。
1. 新建dingding.gradle
未开启签名认证,如需签名按照钉钉文档来即可
import groovy.json.JsonBuilder
import groovy.json.JsonOutput
def dingDingUrl = "https://oapi.dingtalk.com/robot/send?access_token=344de308d49322348c1356de11cac6bbbf6f75ca610b801b1b4bd3f2a079b61c"
ext.postDingMsg = { String qrcodeUrl, String downloadUrl ->
String allTips =
"版本号:V${rootProject.ext.android["versionName"]}\n" +
"${downloadUrl}\n"
postAll(dingDingUrl, allTips, qrcodeUrl, downloadUrl)
}
//发送到群,@所有人
def postAll(url, tips, qrcodeUrl, downloadUrl) {
JsonBuilder builder = new JsonBuilder()
builder {
msgtype 'link'
link {
title '安卓内测更新'
text tips
messageUrl downloadUrl
picUrl qrcodeUrl
}
at {
isAtAll false //@所有人(只有text,markdown,actioncard这三种消息类型支持@功能)
}
}
String data = JsonOutput.prettyPrint(builder.toString())
postDingDing(url, data)
}
//调用接口,发送消息
def postDingDing(urlString, msg) {
if (msg == null) {
return
}
HttpURLConnection conn = null
OutputStream outputStream = null
try {
if (conn == null) {
Long timestamp = System.currentTimeMillis()
URL url = new URL(urlString + "×tamp=${timestamp}")
conn = (HttpURLConnection) url.openConnection()
}
if (conn != null) {
conn.setReadTimeout(15000)
conn.setConnectTimeout(15000)
conn.setDoOutput(true)
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setUseCaches(false)
conn.setRequestProperty("Content-Type", "application/json;charset=utf-8")
conn.connect()
}
if (msg != null && msg.length() > 0) {
DataOutputStream dataOutputStream = new DataOutputStream(conn.getOutputStream())
byte[] t = msg.getBytes("utf-8")
dataOutputStream.write(t)
dataOutputStream.flush()
dataOutputStream.close()
int res = conn.getResponseCode()
if (res == 200) { //成功
InputStream input = conn.getInputStream()
println "发送消息成功: ${readString(input)}"
} else {
println("发送消息失败: " + conn.getResponseCode())
}
}
} catch (EOFException e) {
e.printStackTrace()
} catch (IOException e) {
e.printStackTrace()
} finally {
if (outputStream != null) {
try {
outputStream.close()
} catch (IOException e) {
e.printStackTrace()
}
}
if (conn != null) {
conn.disconnect()
}
}
}
/**
* 读取网络流
*/
private static String readString(InputStream inputStream) throws IOException {
int count = 0;
while (count == 0) {
count = inputStream.available();
//我们可以在次处加上超时判断
}
byte[] b = new byte[count];
if (inputStream.read(b) != -1) {
return new String(b);
}
return "";
}
2. 项目build.gradle
def getApkFullPath() {
return "${projectDir.absolutePath}/build/outputs/apk/release/$apkFileName"
}
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 JsonSlurper().parseText(output)
println parsedJson.data.buildQRCodeURL
println "蒲公英上传完成 版本号:" + parsedJson.data.buildVersion
println "开始发送钉钉群通知"
def downloadUrl = "https://www.pgyer.com/" + parsedJson.data.buildShortcutUrl
postDingMsg(parsedJson.data.buildQRCodeURL, downloadUrl)
}
task uploadApk(dependsOn: "assemble") {
group = "publish"
doLast {
def apk = getApkFullPath()
println "打包完成: $apk"
println "开始上传蒲公英"
uploadPGY(apk)
}
}
3. 其他补充记录
- 获取打包后路径
android.applicationVariants.all { variant ->
if ( (variant.name).equals("release") ) {
variant.outputs.each { output ->
apk = output.outputFile
}
}
}
- 修改打包后的路径和文件名称
applicationVariants.all { variant ->
variant.outputs.all { output ->
String timeStr = new SimpleDateFormat("MM-dd-HH-mm").format(new Date());
if (variant.buildType.name == "debug") {
apkFileName = "anmo-debug-${defaultConfig.versionName}-${timeStr}.apk"
output.outputFileName = apkFileName
} else if (variant.buildType.name == "release") {
apkFileName = "anmo-${defaultConfig.versionName}-${timeStr}.apk"
output.outputFileName = apkFileName
}
}
}