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
}
 

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