日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

AndroidStudio3.6升級后的坑-apk打包

 路人甲Java 2021-12-24

  前段時間嘗試了最新版的AndroidStudio3.6,整體來說gradle調(diào)試和自帶的虛擬機(jī)相比較歷史版本有了更香的體驗(yàn)。

剛好有個新項(xiàng)目,就直接使用最新版了,這次新版的升級除了保持原有的界面風(fēng)格,主要還是優(yōu)化了編譯速度的短板問題,所以新項(xiàng)目很快就開發(fā)完成了。然而在打包的時候卻出了點(diǎn)小插曲,下面先上兩次打包之后的效果圖看下。

 

 

 

   

  奇怪,新打包的apk把以前打包的apk覆蓋掉了,難道是我做了什么操作?

于是我開始檢查build.gradle中的相關(guān)配置,涉及到文件打包的相關(guān)代碼還是照之前老版本的寫法,大致如下。

 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對應(yīng)的gradle5.6在創(chuàng)建項(xiàng)目時新生成的settings.gradle文件中,比以往多加了一行參數(shù),也就是上面用得到的

rootProject.name='GradleApp'

該參數(shù)也就是聲明了新項(xiàng)目的名稱,因此可以在上邊作為全局變量引用,就不需要每個使用的地方都要自定義了。

  話說回來,gradle的寫法沒什么問題,我懷疑是有某個新的tasker是刪除以前的打包文件,于是繼續(xù)查找新增的build.gradle,發(fā)現(xiàn)在項(xiàng)目的配置文件下的確新增了一條陌生的task,

1 task clean(type: Delete) {
2     delete rootProject.buildDir
3 }

看樣子是刪除所有的build文件了,可是打包的文件應(yīng)該不會再build目錄下的吧,只能死馬當(dāng)作活馬醫(yī)了,我把上邊的三行注釋掉,重新試著打包再來一次。。。果然還是一如既往的舊版本被覆蓋了。這里就有點(diǎn)想吐槽AS的開發(fā)者了,既然apk還可以重命名,為什么重命名之后還要再刪除呢?這樣對歷史版本的保存很是不友好啊。當(dāng)然不嫌麻煩的話可以每次將打包好的文件手動存儲到其他位置,但是這就失去了自動化的意義了(對于我這種懶癌癥晚期來說實(shí)在不能忍)。

  那么看來只能重新修改build.gradle中的文件輸出相關(guān)代碼了。思路就是用gradle腳本將打包的新apk復(fù)制并重命名一份,姑且稱之為新命名apk,生成路徑可以到指定目錄,也可以還在原始目錄。下次打包時AS只會自動刪除上次的新apk,而不會刪除上次的新命名apk,同時生成本次的新apk。之后會再次執(zhí)行新增的這段gradle腳本,將本次的新apk復(fù)制重命名為新命名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任務(wù)之后執(zhí)行,不然copy中的變量

${output.outputFile}

只是使用了上一次打包的apk并重命名,之后再執(zhí)行assemble結(jié)束后才會生成本次打包的新apk。

  雖然AS3.6還有些使用不太習(xí)慣的地方,但整體來說比以往的大版本更新效果更顯著,對Android開發(fā)者來說可以把時間用在更高效的事情上,而以前那種在編譯項(xiàng)目時先抽根煙冷靜下的時光恐怕也會一去不復(fù)返了。

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多