前段時間嘗試了最新版的AndroidStudio3.6,整體來說gradle除錯和自帶的虛擬機相比較歷史版本有了更香的體驗,
剛好有個新專案,就直接使用最新版了,這次新版的升級除了保持原有的界面風格,主要還是優化了編譯速度的短板問題,所以新專案很快就開發完成了,然而在打包的時候卻出了點小插曲,下面先上兩次打包之后的效果圖看下,

奇怪,新打包的apk把以前打包的apk覆寫掉了,難道是我做了什么操作?
于是我開始檢查build.gradle中的相關配置,涉及到檔案打包的相關代碼還是照之前老版本的寫法,大致如下,
1 android.applicationVariants.all { variant -> 2 variant.outputs.all { output -> 3 def outputFile = output.outputFile 4 if (outputFile != null && outputFile.name.contains('release')) { 5 def fileName = "${rootProject.name}${android.defaultConfig.versionName}_${releaseTime()}.apk" 6 println "print apk name:" + fileName 7 outputFileName = fileName 8 } 9 } 10 }
順便提一下,AS3.6對應的gradle5.6在創建專案時新生成的settings.gradle檔案中,比以往多加了一行引數,也就是上面用得到的
rootProject.name='GradleApp'
該引數也就是宣告了新專案的名稱,因此可以在上邊作為全域變數參考,就不需要每個使用的地方都要自定義了,
話說回來,gradle的寫法沒什么問題,我懷疑是有某個新的tasker是洗掉以前的打包檔案,于是繼續查找新增的build.gradle,發現在專案的組態檔下的確新增了一條陌生的task,
1 task clean(type: Delete) { 2 delete rootProject.buildDir 3 }
看樣子是洗掉所有的build檔案了,可是打包的檔案應該不會再build目錄下的吧,只能死馬當作活馬醫了,我把上邊的三行注釋掉,重新試著打包再來一次,,,果然還是一如既往的舊版本被覆寫了,這里就有點想吐槽AS的開發者了,既然apk還可以重命名,為什么重命名之后還要再洗掉呢?這樣對歷史版本的保存很是不友好啊,當然不嫌麻煩的話可以每次將打包好的檔案手動存盤到其他位置,但是這就失去了自動化的意義了(對于我這種懶癌癥晚期來說實在不能忍),
那么看來只能重新修改build.gradle中的檔案輸出相關代碼了,思路就是用gradle腳本將打包的新apk復制并重命名一份,姑且稱之為新命名apk,生成路徑可以到指定目錄,也可以還在原始目錄,下次打包時AS只會自動洗掉上次的新apk,而不會洗掉上次的新命名apk,同時生成本次的新apk,之后會再次執行新增的這段gradle腳本,將本次的新apk復制重命名為新命名apk,按照之前對AS的理解,新腳本很簡單,修改后如下,
1 android.applicationVariants.all { variant -> 2 variant.outputs.all { output -> 3 def outputFile = output.outputFile 4 if (outputFile != null && outputFile.name.contains('release')) { 5 def fileName = "${rootProject.name}${android.defaultConfig.versionName}_${releaseTime()}.apk" 6 println "print apk name:" + fileName 7 // outputFileName = fileName 8 assembleRelease.doLast{ 9 project.copy{ 10 from "${output.outputFile}" 11 into "${output.outputFile.parent}" 12 rename("${output.outputFile.name}","${fileName}") 13 println "copy file from ${output.outputFile} to ${fileName}" 14 } 15 } 16 } 17 } 18 }
如此編譯之后即可,生成的檔案效果圖如下,

值得注意的是,在上邊的代碼中copy命令要在assemble任務之后執行,不然copy中的變數
${output.outputFile}
只是使用了上一次打包的apk并重命名,之后再執行assemble結束后才會生成本次打包的新apk,
雖然AS3.6還有些使用不太習慣的地方,但整體來說比以往的大版本更新效果更顯著,對Android開發者來說可以把時間用在更高效的事情上,而以前那種在編譯專案時先抽根煙冷靜下的時光恐怕也會一去不復返了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/4156.html
標籤:Android
