问题:
安装应用提示 该文件包与具有同一名称的现有文件包存在冲突。 无法安装
可能的原因:新版的软件的versionCode和现有版本的软件相同
解决方案:
修改新版本软件的versionCode。为了不用每次发布都手工修改,通过代码可以设置为自动增加+1
方法如下:
第一步:
创建一个文件,名字就叫version.properties(当然,这个不一定要这么写),位置和build.gradle文件同级,app这个是我的执行module,
文件里面的内容是:
VERSION_CODE=10104
第二步:
在build.gradle文件里面加入以下代码(注意:代码的位置和android{...}平级),此方法是获取自增之后的版本号
def getVersionCode() {// 获取版本号
def versionFile = file('version.properties')// 读取第一步新建的文件
if (versionFile.canRead()) {// 判断文件读取异常
Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionFile))
def versionCode = versionProps['VERSION_CODE'].toInteger()// 读取文件里面的版本号
def runTasks = gradle.startParameter.taskNames String runTasksStr="" for(String s:runTasks){ runTasksStr+=s+"," } //runTasks=,\:app\:assembleRelease if (runTasksStr.indexOf("assembleRelease")>=0) {//仅在assembleRelease任务是增加版本号,其他渠道包在此分别配置 // 版本号自增之后再写入文件(此处是关键,版本号自增+1) versionProps['VERSION_CODE'] = (++versionCode).toString() //versionProps['runTasks'] = strs versionProps.store(versionFile.newWriter(), null) } return versionCode.toInteger()// 返回自增之后的版本号
} else {
throw new GradleException("Could not find version.properties!")
}
}
android{
...
}
需要特别注意的是,正常情况,我们只有在打包的时候才需要自增versionCode,平时调试是不需要改变这个值的,所以我们需要加入下面这个判断
如果有多渠道打包时,可以这样写,task1和task2要根据具体情况而定。
if ('assembleRelease' in runTasks || 'task1' in runTasks || 'task2' in runTasks ) {//仅在assembleRelease任务是增加版本号,其他渠道包在此分别配置
// 版本号自增之后再写入文件(此处是关键,版本号自增+1)
versionProps['VERSION_CODE'] = (++versionCode).toString()
versionProps.store(versionFile.newWriter(), null)
}
值得一提的是,我在做这一步的时候,碰到了一个坑,我没有设置多渠道打包,按理说task的值是assembleRelease(一般情况是这样的),但是实际上我这里需要用:app:assembleRelease,至于什么原因,此处就不说了,教大家一个很简单的方法来确定这个值:
就是你打包一个release的apk,打包的过程中你可以看到这段代码,其中2中红色框框里面的中括号内容便是你所需要的
第三步:
build.gradle文件,在你设置版本号的加入一下代码
我这里是直接在默认位置设置的版本号,要注意这段代码的位置哟!!!
versionName和versionCode处理方式类似,最后再去简单说明一下
def currentVersionCode = getVersionCode()
现在,你再去打包,你会发现,version.properties里面的10104变成了10105,如果没有改变,有两个可能:
1、第二步里面的 assembleRelease 错了,请按照第二步中红色文字调试
2、第三步中,getVersionCode()方法的位置错了(我当时不小心放到defaultConfig{...}中去了)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
最后,简单提一下getVersionName()这个方法
def getVersionName() {
def date = new Date();
def versionName = date.format('yyyyMMddHHmmss');
return versionName
}