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

来源:https://www.cnblogs.com/BobGo/archive/2020/05/15/12896100.html

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


  前段時間嘗試了最新版的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開發者來說可以把時間用在更高效的事情上,而以前那種在編譯項目時先抽根煙冷靜下的時光恐怕也會一去不復返了。

 


您的分享是我們最大的動力!

更多相關文章
  • 一、NoSQL簡介 NoSQL並不是No SQL(不再需要SQL),而是指Not Only SQL(不僅僅只有SQL)。NoSQL並不是用來替代關係型資料庫的,而是在某些使用關係型資料庫不合適的場景中,可以使用NoSQL資料庫進行優化,而在系統中主要的、常規的數據仍然使用關係型資料庫。 常用的NoS ...
  • [TOC] 前言 mysqlbinlog工具的作用是解析mysql的二進位binlog的日誌內容,把二進位日誌解析成可以在MySQL資料庫里執行的SQL語句。 1.mysql的binlog日誌是什麼 mysql數據目錄下的xxx bin.000001這樣的文件就是mysql的binlog日誌 2.m ...
  • [TOC] 1.資料庫恢復基本事項 MySQL命令以及source命令恢複數據庫的原理就是在資料庫里重新執行文件的SQL語句的過程。數據恢復和字元集的關聯很大,如果字元集不正確則會導致恢復的數據亂碼。 2.利用source命令恢複數據庫 2.1.使用source命令恢複數據庫的說明 進入MySQL數 ...
  • 1.創建用於接收blob類型的實體類 1 @Getter 2 @Setter 3 public class FileEntity implements Serializable { 4 private static final long serialVersionUID = -55445605143 ...
  • 一、什麼是游標? 游標(Cursor)是處理數據的一種方法,為了查看或者處理結果集中的數據,游標提供了在結果集中一次一行或者多行前進或向後瀏覽數據的能力。 游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。游標可以被看作是一個查詢結果集(可以是零條、一條或由相關的選擇語句檢索出的 ...
  • 使用 YEAR(), MONTH(), DAY() 來獲取年月日 SELECT YEAR(application_date) as years, count(1) FROM patent GROUP BY YEAR(application_date) ORDER BY years -- YEAR(a ...
  • 主從同步遇到 Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'時怎麼解決? 首先遇到這個是... ...
  • 本文介紹Druid查詢數據的方式,首先我們保證數據已經成功載入。 Druid查詢基於HTTP,Druid提供了查詢視圖,並對結果進行了格式化。 Druid提供了三種查詢方式,SQL,原生JSON,CURL。 一、SQL查詢 我們用wiki的數據為例 查詢10條最多的頁面編輯 提交sql 還可以通過H ...
一周排行
  • 文章篇幅較長,閱讀完大概20min,建議收藏閱讀, 讀完會有收穫。歡迎點贊關註 原文鏈接:https://www.softwaretestinghelp.com/types-of-software-testing/ 有多少軟體測試類型呢? 我們作為測試人員瞭解很多種不同的軟體測試類型,例如功能測試( ...
  • 過場CG: 接到公司領導的文件指示,“小熊”需要在6月底去海外執行一個行動代號為【定時任務】的營救計劃,這個計劃關係到公司某個項目的生死(數據安全漏洞),作戰部擬定兩個作戰方案: 方案一:使用務定時任務框架quartz; 方案二:使用windows Service服務。 最終的作戰方案為:兩者配套使 ...
  • 為什麼編寫TaskSchedulerEx類? 因為.NET預設線程池只有一個線程池,如果某個批量任務一直占著大量線程,甚至耗盡預設線程池,則會嚴重影響應用程式域中其它任務或批量任務的性能。 特點: 1、使用獨立線程池,線程池中線程分為核心線程和輔助線程,輔助線程會動態增加和釋放,且匯流排程數不大於參數 ...
  • 前幾天,公眾號後臺有朋友在問Core的中間件,所以專門抽時間整理了這樣一篇文章。 一、前言 中間件(Middleware)最初是一個機械上的概念,說的是兩個不同的運動結構中間的連接件。後來這個概念延伸到軟體行業,大家把應用操作系統和電腦硬體之間過渡的軟體或系統稱之為中間件,比方驅動程式,就是一個典型 ...
  • 參考文檔: https://www.cnblogs.com/liaods/p/10101513.html https://www.cnblogs.com/zyz-Notes/p/12030281.html 本示例使用MVC項目做演示(不推薦,推薦直接用WebAPI),框架版本使用 4.6.2 為了支 ...
  • 引用NModbus 在NuGet搜索NModbus,添加引用。 封裝ModbusTcp類 public class ModbusTCP { private ModbusFactory modbusFactory; private IModbusMaster master; private TcpCl ...
  • 系列文章 基於 abp vNext 和 .NET Core 開發博客項目 - 使用 abp cli 搭建項目 基於 abp vNext 和 .NET Core 開發博客項目 - 給項目瘦身,讓它跑起來 基於 abp vNext 和 .NET Core 開發博客項目 - 完善與美化,Swagger登場 ...
  • Microsoft.AspNetCore.Mvc.Versioning //引入程式集 .net core 下麵api的版本控製作用不需要多說,可以查閱https://www.cnblogs.com/dc20181010/p/11313738.html 普通的版本控制一般是通過鏈接、header此類 ...
  • 結合 AOP 輕鬆處理事件發佈處理日誌 Intro 前段時間,實現了 EventBus 以及 EventQueue 基於 Event 的事件處理,但是沒有做日誌(EventLog)相關的部分,原本想增加兩個介面, 處理事件發佈日誌和事件處理日誌,最近用了 AOP 的思想處理了 EntityFrame ...
  • 什麼是sam 轉換 Single Abstract Method 實際上這是java8中提出的概念,你就把他理解為是一個方法的介面的就可以了 看一下我們每天都在使用的線程池 ExecutorService executorService= Executors.newScheduledThreadPo ...