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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...