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

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

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

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、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 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...