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

更多相关文章

  1. Android开发-直播视讯(3)-创建一个Ubuntu虚拟机并实现VMtools文
  2. 关于Android资源文件中出现百分号的问题
  3. 有没有方法在不root手机的情况下读取Data目录下的文件
  4. Android 中文件类型与MIME的匹配表
  5. Android:无法在同一部手机上执行通过Linux部署编译的文件
  6. 多个dex文件定义了Landroid/支持/v13/app/FragmentCompatICS。
  7. 解决:AndroidStudio 下使用AIDL不能生成对应java文件
  8. 尽管在清单文件中指定了权限,但是ACCESS_FINE_LOCATION SecurityE
  9. Android Web-View:将本地Javascript文件注入远程网页

随机推荐

  1. Android 代码改变图片颜色android:tint="
  2. Android中让View匀速旋转
  3. Android 底部导航栏中间凸起、越界显示
  4. Android 默认水波纹的使用和去除
  5. android开发之android:padding和android:
  6. EditText 文字验证
  7. Windows下git下载android source
  8. Android 获取手机卡相关信息
  9. Android:控件布局(相对布局)RelativeLayout(
  10. Android开发环境搭建