Gradle Yapılandırmasını Önbelleğe Alma — Bir Derleme Dinleyicisini Derleme Hizmetleriyle Değiştirme | tarafından Jonny Caley | Haz, 2022

Gradle Yapılandırmasını Önbelleğe Alma — Bir Derleme Dinleyicisini Derleme Hizmetleriyle Değiştirme |  tarafından Jonny Caley |  Haz, 2022

Gradle kısa süre önce “yapılandırma önbelleği” adlı yeni bir özelliği kullanıma sundu.yapılandırma aşamasının sonucunu önbelleğe alarak ve sonraki yapılar için yeniden kullanarak yapı performansını önemli ölçüde iyileştirir. Yapılandırma önbelleğini kullanarak, yapı komut dosyaları gibi yapı yapılandırmasını etkileyen hiçbir şey değişmediğinde, Gradle yapılandırma aşamasını tamamen atlayabilir.

Yapılandırma önbelleğini etkinleştirmenin bir gereksinimi, projenizin herhangi bir kayıt yapmaması gerektiğidir. BuildListeners bunlar diske serileştirilemediğinden ve dolayısıyla önbelleğe alınamadığından. Sonuç olarak, geliştiricileri bir kaya ile sert bir yer arasında sıkışıp bırakır, çünkü inşa süresi bilgisi için inşa hızından fedakarlık etmek isteyip istemediklerine veya tam tersi bir karar vermek zorunda kalırlar.

Bu blog yazısında, yapılandırma önbelleğini nasıl etkinleştirebileceğinizden ve Gradle kullanarak derleme verilerini nasıl yakalayabileceğinizden bahsedeceğim. Yapı Hizmetleri ve elde edilmesi için çevrimiçi olarak çok az kaynağın bulunduğu dahili API’leri.

Derleme hizmetleri, bir Gradle derlemesine bağlanmak ve görev yürütme ve işlemi tamamlama hakkında bilgi almak için alternatif bir mekanizma sağlar. Ve en önemlisi, yapılandırma önbelleğe alınabilir.

İnşa Süresi Bilgisini Yakalama

Derleme zamanı bilgilerini yakalamak için Gradle’ın dahili özelliklerini uygulayan bir derleme hizmeti oluşturuyoruz. BuildOperationListener arayüz. Ne zaman BuildOperationListener#tamamlandı ile denir RunRootBuildWorkBuildOperationType yapı tamamlandı ve yapı başlangıç ​​zamanı, onun aracılığıyla sağlanır. Detaylar.

Ardından, yapılandırma zamanını yakalamak ve yapılandırma aşamasının başarıyla tamamlandığını doğrulamak için, tarafından sağlanan ilk görevin başlangıç ​​zamanını kullanırız. operasyonFinishEvent ve ondan yapının başlangıç ​​zamanını çıkarın.

Bir kere BuildDurationService oluşturuldu, almaya başlamak için BuildOperationListener geri aramalar, hizmeti Gradle’s ile kaydederiz BuildEventListenerRegistryInternal.

Görev Yürütme Bilgilerini Yakalama

Derleme süresini yakalamaya benzer şekilde, Gradle, görev tamamlama olaylarını aşağıdakiler aracılığıyla dinlemek için bir hizmet kaydetmenize olanak tanır. İşlem TamamlamaDinleyici geri aramalar

Her olayın görünen adını filtrelemek, görev yürütme sonucunu ve (varsa) bir derleme hatası mesajı sağlayacaktır.

Geri aramaları almaya başlamak için hizmeti bir görev tamamlama dinleyicisi olarak kaydederiz.

Raporlama Verileri

Bu verileri raporlamak için, oluşturma ve raporlama arasındaki işlevselliği izole etmek için başka bir derleme hizmeti oluşturacağız ve hizmetleri, verilerine erişmek için argümanlar olarak ayrıştıracağız. uygulanması Otomatik Kapatılabilir arabirim, raporun derlemenin sonunda çağrılmasıyla birlikte raporu tetiklemek için yakın bir işlev sağlar. Ve son olarak, uygularız BuildOperationListener yapı hizmetinin yapı sırasında başlatılmasını sağlamak için boş işlevlerle ve Otomatik Kapatılabilir#onClose Idam edildi (Otomatik Kapatılabilir#onClose hizmet elden çıkarıldığında yürütülür, çünkü bu hizmet aslında herhangi bir görev tarafından kullanılmadığından, hizmeti başlatmak için Gradle’a başka bir neden vermemiz gerekir, bu nedenle onu derleme işlemi geri çağrıları için kaydettiririz).

Son olarak build servisini kaydedip diğer servisleri parametre olarak ayrıştırıyoruz.

Her şey doğru yapıldıysa, Çıktı Oluştur pencerenizde aşağıdakine benzer bir çıktı görmelisiniz:

BuildReport(totalElapsedBuildTimeMs=23525, configurationTimeMs=8877, taskExecutionStatistics=org.gradle.api.internal.tasks.execution.statistics.TaskExecutionStatistics@6a5aabca, buildFailed=false, buildFailureMessage=null, buildTaskNames=:app:assembleDebug, gradleVersion=7.4.2, daemonsRunning=1)

Önbelleğe Alınabilir Değerleri Ayrıştırma

Yapının görev adları, Gradle sürümü vb. gibi bir yapı hizmetine ek değerler de ayrıştırmak isteyebilirsiniz. Ancak, yapmadan önce, bu değerlerin önbellek kullanıldığında derlemelerdeki yapılandırma önbelleği tarafından sağlanacağını bilmek önemlidir, bu nedenle, çalışan Gradle arka plan programlarının sayısı gibi önbelleğe alınmış derlemeler arasında değişebilecek herhangi bir değeri ayrıştırmayın.

Önbelleğe alınabilir değerleri ayrıştırmak için hizmetinizde tanımlanan BuildServiceParameters arabirimine ek get işlevleri eklersiniz. Not: İşlev adları “get” ile başlamalı ve bir Özelliğe sarılmış türü döndürmelidir.

Önbelleğe alınan değerler daha sonra hizmet kaydedilirken ayarlanır.

uyarılar

  • Kararsız olarak işaretlenmiş veya dahili bir Gradle dizininde yaşayan çok sayıda API vardır. Bununla birlikte, bu API’lerin gelecekte tamamen değişmesi veya tamamen kaldırılmasıyla ilgili artan riskler gelir.
  • Yapılandırma aşaması başarısız olduğunda yapılandırma zamanı bildirilmez. Bunun nedeni, başlangıç ​​oluşturma süresinin kök görevden alınmasıdır, yapılandırma aşaması başarısız olursa kök görev yürütülmez ve bizim için başlangıç ​​zamanı yoktur.

Yukarıdaki kodların tümü ile çalışan bir proje bulabilirsiniz. benim Github’ım.

Mutlu bina…

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.