問題:
安裝應用提示 該文件包與具有同一名稱的現有文件包存在衝突。 無法安裝
可能的原因:新版的軟件的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
}