前段時間嘗試了最新版的AndroidStudio3.6,總體來講gradle調試和自帶的虛擬機相比較歷史版本有了更香的體驗。android
恰好有個新項目,就直接使用最新版了,此次新版的升級除了保持原有的界面風格,主要仍是優化了編譯速度的短板問題,因此新項目很快就開發完成了。然而在打包的時候卻出了點小插曲,下面先上兩次打包以後的效果圖看下。app
奇怪,新打包的apk把之前打包的apk覆蓋掉了,難道是我作了什麼操做?gradle
因而我開始檢查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文件中,比以往多加了一行參數,也就是上面用獲得的ui
rootProject.name='GradleApp'
該參數也就是聲明瞭新項目的名稱,所以能夠在上邊做爲全局變量引用,就不須要每一個使用的地方都要自定義了。spa
話說回來,gradle的寫法沒什麼問題,我懷疑是有某個新的tasker是刪除之前的打包文件,因而繼續查找新增的build.gradle,發如今項目的配置文件下的確新增了一條陌生的task,3d
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的理解,新腳本很簡單,修改後以下。code
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 }
如此編譯以後便可,生成的文件效果圖以下。blog
值得注意的是,在上邊的代碼中copy命令要在assemble任務以後執行,否則copy中的變量
${output.outputFile}
只是使用了上一次打包的apk並重命名,以後再執行assemble結束後纔會生成本次打包的新apk。
雖然AS3.6還有些使用不太習慣的地方,但總體來講比以往的大版本更新效果更顯著,對Android開發者來講能夠把時間用在更高效的事情上,而之前那種在編譯項目時先抽根菸冷靜下的時光恐怕也會一去不復返了。