由于项目提测需要编译出apk然后发布到蒲公英平台供测试人员下载,在之前是需要手动编译出apk文件然后打开蒲公英网站再手动上传发布到平台,这样如果要上传几个不同的版本和渠道包就比较麻烦,于是,一个能一键自动化编译出想要的渠道和版本的apk并自动发布到蒲公英平台的功能就显得有必要了。
功能的完整流程可以分为两部分,分别为通过gradle的task任务编译出apk以及shell命令上传apk到蒲公英平台。
task debugTask() {
//该任务是清理apk的文件,保证生成的apk是最新且唯一
dependsOn 'clearBacApkDir'
//这个任务是结合walle编译渠道包 若无该需求则直接使用assembleDebug就行
dependsOn 'walleDebug'
// dependsOn 'assembleDebug
}
task clearBacApkDir(type: Delete) {
String bakPath = "./channels"
file(bakPath).list().each {
f ->
delete "${bakPath}/${f}"
}
println "删除channels文件"
}
task walleDebug(type: Exec) {
//此处指定commandLine的执行文件 我们执行的文件gradlew位于APP的上层目录 因此"../"
workingDir "../"
//walle的单渠道打包命令为./gradlew clean assembleReleaseChannels -PchannelList=meituan
commandLine "./gradlew", "clean", "assembleDebugChannels", "-PchannelList=huawei"
}
//一键自动打包上传蒲公英的任务 最终只需执行该任务就可自动打包发布到蒲公英平台了
task uploadDebugApkTask(type: Exec) {
dependsOn 'debugTask'
def mode = "debug"
def remark = "debug环境包"
//uploadApk.sh为shell文件 负责获取到编译出来的apk并上传到蒲公英平台
commandLine 'sh', '-c', "./sh/uploadApk.sh $mode $remark"
}
//walle的编译渠道 文件命名等配置
walle {
// 指定默认的渠道包的输出路径
apkOutputFolder = new File("${project.getProjectDir()}/channels")
// 定制渠道包的APK的文件名称
apkFileNameFormat = 'doctor_${channel}_v${versionName}_${buildType}.apk';
// 渠道配置文件
channelFile = new File("${project.getProjectDir()}/channel")
}
afterEvaluate {
project.android.applicationVariants.all { BaseVariant variant ->
variant.assemble.doFirst {
//实际上渠道包的输出路径
project.walle.apkOutputFolder = new File("${project.getProjectDir()}/channels/${variant.getBuildType().name}")
project.walle.channelFile = new File("${project.getProjectDir()}/channel")
}
}
}
下面为.sh文件的内容 主要是获取到编译出来的apk文件并上传到蒲公英平台
#!/bin/sh
#MAIN_MODULE指AndroidStudio工程目录下面主module
MAIN_MODULE="."
#从build.gradle中传入的两个参数 MODE为编译的类型 REMARK为描述
MODE=$1
REMARK=$2
#蒲公英API账号 通过蒲公英平台的api信息查看后填入
PGYER_API_KEY=""
PGYER_USER_KEY=""
#APK路径
//若使用assembleDebug打包 则使用下面被注释的APK_PATH
#APK_PATH="${MAIN_MODULE}/build/outputs/apk/${MODE}"
APK_PATH="${MAIN_MODULE}/channels/${MODE}"
echo "current path: $APK_PATH"
#遍历apk
for APK_FILE in ${APK_PATH}/*; do
APK_NAME=`basename $APK_FILE`
if [[ "$APK_NAME" =~ "${MODE}.apk" ]];then
echo "Upload apk:$APK_NAME"
break
fi
done
#curl上传至蒲公英,默认直接发布,不发布到广场
curl -F "file=@${APK_PATH}/${APK_NAME}" -F "userKey=${PGYER_USER_KEY}" -F "_api_key=${PGYER_API_KEY}" -F "buildUpdateDescription=${REMARK}" http://www.pgyer.com/apiv2/app/upload
至此,一套Mac环境下得Android一键自动打包上传到蒲公英的功能就完成了,若需要编译预发与生产环境,则只需要将上面的任务copy一下,将Debug分别改为Preissue与Release就可以了。只需要在Terminal中执行./gradlew uploadDebugApkTask 或者双击as中右侧gradle里出现的uploadDebugApkTask,就可以轻松打包发布了。当然,有条件的同学可以通过Jenkins配置远程打包,让测试同学自己就可以编译出自己想要的包,从此测试同学能随时编译出自己想要的环境和版本的包,开发的同学们也就不用经常在快乐的敲代码途中被测试同学催着打包各种版本和环境的包了。