Android studio3.0以上打包versionCode自增和文件名加上版本号,打包时间

昨天 ,在打包时候,感觉每次打包完,自己再重新命名太费事了。于是研究了一下,贡献出来。惠及他人。
首先,如果你是想versionCode自增的话,得要在module下面 创建一个文件version.properties,内容如下

#Wed Oct 10 10:27:03 CST 2018
versionCode=3

很简洁,很质朴。

然后在module 的build.gradle 里面的Android节点下,添加以下代码。这里我贴出了详细的代码。上面都有注释

/**
 * @param filename  要打开的文件名字
 * @param propName   文件里面的键名字
 * @param isRootProject   是否用rootProject 文件打开,true 的话,在编译时候可以得到值,打包时候无法得到值。false的话在打包时候可以得到值,编译时候 无法得到值
 * @return  所选择的文件里面的propName对应的值
 */
def getProperty(String filename, String propName,boolean isRootProject) {
    //在这里 必须是在rootProject.file  如果 file的话 ,编译时候会出错
    def propsFile
    if (isRootProject) {
        propsFile = rootProject.file(filename)
    }else {
        propsFile=file(filename)
    }
    if (propsFile.exists()) {
        def props = new Properties()
        props.load(new FileInputStream(propsFile))
        if (props[propName] != null) {
            //下面这个输出在android studio3.1里面 在Build窗口 右边一个锤子下面 toggle哪里,就是原来的message哪里
            print("versionCode "+props[propName])
            return props[propName]
        } else {
            print("No such property " + propName + " in file " + filename);
        }
    } else {
        print(filename + " does not exist!")
    }
}

//version.properties  里面的vesioncode自增
def PropertyAdd(String filename, String propName) {
    //这里必须用file  如果用rootProject的话 则找不到file为null
    def propsFile =file(filename)
    //只有在打正式版的情况下才继续运行,否则退出方法,这样是为了防止 编译时候versionCode 也自增 if里面的参数可以在Build窗口里面 message 最上边[]里面就是
    def runTasks = gradle.startParameter.taskNames
    if (!(':app:assembleRelease' in runTasks)) {
        return
    }
    if (propsFile.exists()) {
        def props = new Properties()
        props.load(new FileInputStream(propsFile))
        //这里要注意 props[propName] 是String 类型
        if (props[propName] != null) {
             def code= (props[propName]).toInteger() //转成Integer
             props[propName]= (++code).toString()  //自增 且转成String
        } else {
            print("No such property " + propName + " in file " + filename);
        }
        //在这里提交 对version.properties的更改
        props.store(propsFile.newWriter(),null)
    } else {
        print(filename + " does not exist!")
    }
}

//用于生成时间
def buildTime() {
    def date = new Date()
    //yy年 MM月 dd日 HH小时 mm分钟 ss秒
    def formattedDate = date.format('yyMMdd_HHmm')
    return formattedDate
}
android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    defaultConfig {
        applicationId "com.example.admin.appstore"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode getProperty("version.properties","versionCode",true)
        versionName "1.0.1"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    //给文件重新命名的代码,记住是在Android 节点下
    android.applicationVariants.all {
        variant ->
            variant.outputs.all {
                output ->
                    //拿到输出文件
                    def outputFile = output.outputFile
                    //这里也可以调用上面的 (':app:assembleRelease' in runTasks) 进行判断 感觉会更好一些
                    if (outputFile.name.contains("release")) {
                        //在字符串里面调用方法的话,得要${ }里面调用 切记
                        outputFileName = new File("../release/","release-${defaultConfig.versionName}-${getProperty("version.properties","versionCode",false)}_DATE-${buildTime()}.apk");
                        //调用方法 增加versionCode 值
                        PropertyAdd("version.properties", "versionCode")
                    }
                    if (outputFile.name.contains("debug")) {
                        outputFileName = new File("../debug/","debug-${defaultConfig.versionName}-${getProperty("version.properties","versionCode",false)}_DATE-${buildTime()}.apk")
                    }
            }
    }
}

这样就实现了,在打release版本包的时候,versionCode自增 和打包出来的文件名含有versionCode和打包时间

具体效果如下

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/a1064072510/article/details/82994857