中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Gradle?Build?Cache引發的Task緩存編譯問題怎么解決

發布時間:2022-06-23 09:33:50 來源:億速云 閱讀:373 作者:iii 欄目:開發技術

今天小編給大家分享一下Gradle Build Cache引發的Task緩存編譯問題怎么解決的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

基礎知識

Gradle 構建緩存是一種緩存機制,旨在通過重用其他構建產生的輸出來節省時間。構建緩存通過存儲(本地或遠程)構建輸出并允許構建在確定輸入沒有更改時從緩存中獲取這些輸出來工作,從而避免了重新生成它們的昂貴工作。

使用構建緩存的第一個功能是任務輸出緩存。本質上,任務輸出緩存利用了與最新檢查相同的智能,當先前的本地構建已經產生一組任務輸出時,Gradle 使用它來避免工作。但是,任務輸出緩存不僅限于同一工作區中的先前構建,而是允許 Gradle 重用本地機器上任何位置的任何早期構建的任務輸出。當使用共享構建緩存進行任務輸出緩存時,這甚至可以跨開發人員機器和構建代理工作。

除了任務之外,工件轉換還可以利用構建緩存并重用其輸出,類似于任務輸出緩存。

以上內容摘自gradle官方文檔,鏈接如下

我簡單的翻譯下給各位大佬,在本地存在build cache的情況下,gradle task會基于當前的輸入來作為緩存的key值,如果輸入內容沒有發生變更,則意味著本Task可以被跳過,另外這個不同于增量編譯。

Gradle?Build?Cache引發的Task緩存編譯問題怎么解決

又可以偷下官方的圖片了。舉個栗子,JavaCompiler task的輸入的java文件和上一次編譯的一樣,則意味著該任務可以使用原來編譯輸出作為編譯產物。

Cacheable tasks

任務類型需要使用 @CacheableTask 注釋選擇加入任務輸出緩存。 請注意,@CacheableTask 不被子類繼承。 默認情況下,自定義任務類型不可緩存。

官方有說明什么情況下會使用編譯緩存,首先我們的Task要被定義成@CacheableTask

另外對于Task內部的輸入和輸出也需要打上@TaskInputs@TaskOutputs注解。這樣才能保證當前的Task具備了編譯緩存的能力。

所以想要寫一個能具備緩存能力的Task也是比較復雜的。這也就是為什么Android后面會開始推動Artifacts的使用了,讓開發盡量可以少關心輸入輸出相關的邏輯。

我們升級適配完AGP 7.0 | 雜談

那么相對的,沒有定義@CacheableTask的則認為是內有編譯緩存的任務。

TaskOutput

在上述這種被跳過的任務哦,一般都會有在Task編譯完成之后帶上一些特殊的標識符。

  • (no label) or EXECUTED 任務正常執行了。

  • UP-TO-DATE 任務輸出沒有變更。

  • 輸入輸出均沒有發生變更。

  • 任務執行了,但是任務告訴gradle輸出并未發生變更。

  • 任務沒有執行和一些依賴項,但所有依賴項都是最新的、已跳過或來自緩存。

  • 任務沒有執行也沒有依賴。

  • FROM-CACHE 任務的輸出可以從之前的執行中找到。任務已從構建緩存恢復輸出。

  • SKIPPED 該任務沒有被執行。任務已明確從命令行中排除。

  • NO-SOURCE 當前無需執行該任務。輸入內容并沒有源文件,比如.java

簡單的來說,除了第一種情況以外,其他的都是任務被跳過。

有趣的編譯問題

好了,有了前置的知識儲備的情況下,我們就可以展開說一下我們最近碰到的一個奇怪的問題了。

我們有個protobuf編譯的倉庫,專門負責將pb文件轉化成java或者kotlin。然后會把這些生成的文件移動到另外兩個模塊進行打包,最后刪除生成的所有類文件。然后再去執行javacompiler task。

這個模塊出現了一個二次編譯的問題。第一次打包protobuf模塊的時候編譯是正常的,然后當二次編譯該模塊的情況下,該模塊就會出現類丟失的問題。

問題分析

這個問題分析起來就比較簡單。在二次編譯的情況下呢,因為輸入的內容并沒有發生變更,所以觸發了Gradle Task相關的緩存,然后所有的pb文件轉化成java kt的過程就被跳過了。但是呢后續的copy task因為本身不具備緩存能力,所以他還是會執行一次cv的任務。但是原來生成的java和kt已經被刪除了。這個時候他就會把空的文件夾進行一次覆蓋操作。之后就導致了原來的java和kt文件全部丟失的問題。

這就是一個很有趣的build cache導致的奇形怪狀的問題,因為上一個任務具備了編譯緩存,之后跳過了編譯直接用了原來的output輸出。但是呢下一個任務非緩存的,所以必然還是會執行拷貝任務。

以上就是“Gradle Build Cache引發的Task緩存編譯問題怎么解決”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武城县| 静乐县| 房产| 诸城市| 资兴市| 桑日县| 山东省| 苗栗市| 怀仁县| 祁门县| 克什克腾旗| 民丰县| 炉霍县| 公安县| 缙云县| 河间市| 杂多县| 盈江县| 常山县| 台安县| 通山县| 黔东| 宁津县| 隆子县| 乌兰察布市| 五指山市| 平湖市| 垫江县| 西畴县| 曲阳县| 高平市| 洛扎县| 阳江市| 济宁市| 文昌市| 华容县| 六安市| 望都县| 永平县| 瑞金市| 呼伦贝尔市|