Android 打包VersionCode自增、APK文件名修改、上传蒲公英

版权声明:原创文章,转载请注明来源 http://blog.csdn.net/lxmy2012 https://blog.csdn.net/lxmy2012/article/details/76299166

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}已更新到蒲公英" [email protected]

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

猜你喜欢

转载自blog.csdn.net/lxmy2012/article/details/76299166