Android 打包VersionCode自增、APK文件名修改、上传蒲公英
一、VersionCode自增
实现思路:
在properties文件中记录VersionCode,每次打包时读取并自增写入
1. 新建properties文件
比如:auto_add_version_code.properties,存放在gradle.properties同级目录
#就写一个version_code就行
VERSION_CODE=1
2. 修改app/build.gradle文件
...
ext { // 定义当前gradle文件的全局变量
isRelease = checkRelease()
}
// 通过taskName判断当前操作是否是在打release包,只需执行一次
def checkRelease() {
def runTasks = gradle.startParameter.taskNames
for (String task : runTasks) {
// 这里认为执行“assemble”和非“debug”的任务就是执行“release”的任务
if (task.contains("assemble") && !task.contains("Debug")) {
return true
}
}
return false
}
// 自增 version code
def autoAddVersionCode() {
def propFile = file('../auto_add_version_code.properties')
def Properties props = new Properties()
props.load(new FileInputStream(propFile))
// 读取gradle.properties文件中定义的VERSION_CODE属性
def code = props['VERSION_CODE'].toInteger()
if (checkRelease()) {
code++
props['VERSION_CODE'] = code.toString()
// 将最新的versionCode写入gradle.properties文件中
props.store(propFile.newWriter(), null)
}
return code
}
android {
...
defaultConfig {
...
versionCode autoAddVersionCode()
versionName "1.0.0"
...
}
...
}
测试:
通过 android studio Build Generate Signed APK 打包,versionCode自增;
通过 ./gradlew 打包,versionCode没有自增,需要修改checkRelease方法
二、APK文件名修改
1. 修改app/build.gradle文件
android {
...
defaultConfig {
...
}
...
// 打包输出apk文件名称
android.applicationVariants.all { variant ->
// 仅修改正式包
if ("release" == variant.buildType.name) {
variant.outputs.each { output ->
output.outputFile = new File(output.outputFile.parent, "应用名称v" + defaultConfig.versionName + "_build" + defaultConfig.versionCode + "_" + buildType.name + ".apk");
}
}
}
}
三、打包后上传蒲公英
实现思路:
通过shell脚本调用蒲公英api上传
1. 新建shell脚本
比如:uploadApk.sh,存放在app/build.gradle同级目录
#!/bin/sh
#MAIN_MODULE指AndroidStudio工程目录下面主module
#打包用地址
MAIN_MODULE="."
#单独测试用地址
#MAIN_MODULE="./app"
#蒲公英API账号
PGYER_USER_KEY="登录你的蒲公英账号查看[https://www.pgyer.com/doc/api#uploadApp]"
PGYER_API_KEY="登录你的蒲公英账号查看[https://www.pgyer.com/doc/api#uploadApp]"
#APK路径
APK_PATH="${MAIN_MODULE}/build/outputs/apk"
echo "=============================================="
#echo "current path: `pwd`"
#echo "APK_PATH=${APK_PATH}"
APK_LIST=`ls -t ${APK_PATH}`
#echo "${APK_LIST}"
#查找 最新的apk包
for APK_FILE in ${APK_LIST}; do
APK_NAME=${APK_FILE}
#echo "$APK_FILE"
break;
done
if [ -n "$APK_NAME" ]; then # 判断是否为空
echo "上传 $APK_FILE 到蒲公英"
#上传至蒲公英 updateDescription(版本描述)
RESULT=$(curl -F "file=@${APK_PATH}/${APK_NAME}" -F "uKey=${PGYER_USER_KEY}" -F "_api_key=${PGYER_API_KEY}" http://www.pgyer.com/apiv1/app/upload)
echo "蒲公英返回 $RESULT"
# 发邮件
echo "${RESULT}" | mail -s "${APK_NAME}已更新到蒲公英" you_mail@qq.com
fi
单独测试该脚本,可能需要变更权限
chmod +x uploadApk.sh
执行
app/uploadApk.sh
2. 修改app/build.gradle文件
...
ext { // 定义当前gradle文件的全局变量
isRelease = checkRelease()
}
// 通过taskName判断当前操作是否是在打release包,只需执行一次
def checkRelease() {
def runTasks = gradle.startParameter.taskNames
for (String task : runTasks) {
// 这里认为执行“assemble”和非“debug”的任务就是执行“release”的任务
if (task.contains("assemble") && !task.contains("Debug")) {
return true
}
}
return false
}
// 自增 version code
def autoAddVersionCode() {
def propFile = file('../auto_add_version_code.properties')
def Properties props = new Properties()
props.load(new FileInputStream(propFile))
// 读取gradle.properties文件中定义的VERSION_CODE属性
def code = props['VERSION_CODE'].toInteger()
if (checkRelease()) {
code++
props['VERSION_CODE'] = code.toString()
// 将最新的versionCode写入gradle.properties文件中
props.store(propFile.newWriter(), null)
}
return code
}
android {
...
defaultConfig {
...
versionCode autoAddVersionCode()
versionName "1.0.0"
...
}
//签名
signingConfigs {
debug {
...
}
release {
...
}
}
buildTypes {
release {
// 混淆
minifyEnabled true
// Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
// 前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
// 打包输出apk文件名称
android.applicationVariants.all { variant ->
// 仅修改正式包
if ("release" == variant.buildType.name) {
variant.outputs.each { output ->
output.outputFile = new File(output.outputFile.parent, "应用名称v" + defaultConfig.versionName + "_build" + defaultConfig.versionCode + "_" + buildType.name + ".apk");
}
}
}
...
}
...
//上传到蒲公英task
task myUploadApkTask(type: Exec) {
commandLine 'sh','-c','./uploadApk.sh'
}
// 编译打包
task myBuild(){
dependsOn 'assembleRelease'
dependsOn 'myUploadApkTask'
}
测试:
使用 ./gradlew myBuild 打包
// TODO
这里将打包VersionCode自增、APK文件名修改、上传蒲公英糅合在一起,
使用 ./gradlew myBuild 打包,code不能自增,需要修改checkRelease方法
待改进
参看
[http://blog.csdn.net/kevinscsdn/article/details/53582096]
[http://www.jianshu.com/p/447b2cbc8fb2]
[http://www.runoob.com/linux/linux-shell.html]
END