昨天 ,在打包时候,感觉每次打包完,自己再重新命名太费事了。于是研究了一下,贡献出来。惠及他人。
首先,如果你是想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和打包时间