android 该文件包与具有同一名称的现有文件包存在冲突

问题:

安装应用提示 该文件包与具有同一名称的现有文件包存在冲突。 无法安装

可能的原因:新版的软件的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
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章