您好,登錄后才能下訂單哦!
今天小編給大家分享一下Gradle Build Cache引發的Task緩存編譯問題怎么解決的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
Gradle 構建緩存是一種緩存機制,旨在通過重用其他構建產生的輸出來節省時間。構建緩存通過存儲(本地或遠程)構建輸出并允許構建在確定輸入沒有更改時從緩存中獲取這些輸出來工作,從而避免了重新生成它們的昂貴工作。
使用構建緩存的第一個功能是任務輸出緩存。本質上,任務輸出緩存利用了與最新檢查相同的智能,當先前的本地構建已經產生一組任務輸出時,Gradle 使用它來避免工作。但是,任務輸出緩存不僅限于同一工作區中的先前構建,而是允許 Gradle 重用本地機器上任何位置的任何早期構建的任務輸出。當使用共享構建緩存進行任務輸出緩存時,這甚至可以跨開發人員機器和構建代理工作。
除了任務之外,工件轉換還可以利用構建緩存并重用其輸出,類似于任務輸出緩存。
以上內容摘自gradle官方文檔,鏈接如下
我簡單的翻譯下給各位大佬,在本地存在build cache的情況下,gradle task會基于當前的輸入來作為緩存的key值,如果輸入內容沒有發生變更,則意味著本Task可以被跳過,另外這個不同于增量編譯。
又可以偷下官方的圖片了。舉個栗子,JavaCompiler task
的輸入的java文件和上一次編譯的一樣,則意味著該任務可以使用原來編譯輸出作為編譯產物。
任務類型需要使用 @CacheableTask 注釋選擇加入任務輸出緩存。 請注意,@CacheableTask 不被子類繼承。 默認情況下,自定義任務類型不可緩存。
官方有說明什么情況下會使用編譯緩存,首先我們的Task
要被定義成@CacheableTask
。
另外對于Task內部的輸入和輸出也需要打上@TaskInputs
和@TaskOutputs
注解。這樣才能保證當前的Task具備了編譯緩存的能力。
所以想要寫一個能具備緩存能力的Task也是比較復雜的。這也就是為什么Android后面會開始推動Artifacts
的使用了,讓開發盡量可以少關心輸入輸出相關的邏輯。
我們升級適配完AGP 7.0 | 雜談
那么相對的,沒有定義@CacheableTask
的則認為是內有編譯緩存的任務。
在上述這種被跳過的任務哦,一般都會有在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緩存編譯問題怎么解決”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。