Uzun derleme süreleri, geliştirme sürecinizi yavaşlatır. Bu sayfada, projenin kapsamı derleme hızı sorunlarını gidermeye yardımcı olur.
Uygulamanızın derleme hızını iyileştirmeye yönelik genel süreç şu şekildedir:
- Birkaç örnekle derleme yapılandırmanızı optimize edin doğrudan fayda sağlayan adımlar bunlardır.
- Bazılarını tanımlamak ve teşhis etmek için derlemenizin profilini çıkarın projenize veya iş istasyonunuza özgü olabilecek daha zorlu engellerden bahsedin.
Uygulamanızı geliştirirken Android çalıştıran bir cihaza dağıtın 7.0 (API düzeyi 24) veya sonraki sürümler. Android platformu, uygulamanıza güncelleme aktarmak için daha iyi mekanizmalar uygular, Android Çalışma zamanı (ART) ve birden fazla DEX dosyası için yerel destek.
Not: İlk temiz derlemenizden sonra, sonraki sürümlerden birinin olmak üzere, başka herhangi bir araç kullanılmadan bile çok daha hızlı performans optimizasyonları yapabilirsiniz. Bunun nedeni, Gradle arka plan programının "ısınma" isteği performans artırma dönemidir; diğer JVM'lere benzer daha fazla bilgi edineceksiniz.
Derleme yapılandırmanızı optimize edin
Derlemeyi iyileştirmek için Android Studio projenizin hızı.
Araçlarınızı güncel tutun
Android araçları, neredeyse 200'den fazla uygulamanın her güncellemede. Bu sayfadaki bazı ipuçlarında, en son sürümünü değil. En son optimizasyonlardan yararlanmak için aşağıdakileri takip edin Bitiş tarihi:
kapt yerine KSP kullanın
Kotlin Ek Açıklama İşleme Aracı (kapt), Kotlin'den önemli ölçüde daha yavaştır Sembol İşlemci (KSP). Ek açıklamalı Kotlin kaynağı yazıyor ve ek açıklamaları işler (ör. Oda) KSP'yi destekleyen bir ürün ya da hizmet sağlayıcı kullanıyorsanız KSP'ye geçiş yapmanız gerekir.
Gereksiz kaynakları derlemekten kaçının
Test etmediğiniz kaynakları derlemekten ve paketlemekten kaçının: ek dil yerelleştirme ve ekran yoğunluğu kaynakları. Bunun yerine yalnızca bir "dev" uygulamanız için dil kaynağı ve ekran yoğunluğu aşağıdaki örnekte gösterildiği gibi biraz aroma:
Eski
android { ... productFlavors { dev { ... // The following configuration limits the "dev" flavor to using // English stringresources and xxhdpi screen-density resources. resourceConfigurations "en", "xxhdpi" } ... } }
Kotlin
android { ... productFlavors { create("dev") { ... // The following configuration limits the "dev" flavor to using // English stringresources and xxhdpi screen-density resources. resourceConfigurations("en", "xxhdpi") } ... } }
Gradle Plugin Portal'ı en son konuma getirerek denemeler yapın
Android'de tüm eklentiler google()
ve
mavenCentral()
depo. Ancak derlemeniz
üçüncü taraf eklentilerine ihtiyaç duyarsanız
gradlePluginPortal()
geliştirmenizi sağlar.
Gradle, depoları bildirildikleri sırayla arar.
Bu nedenle, listelenen kod depoları ilk önce
tercih edebilirsiniz. Bu nedenle, gradlePluginPortal()
ile deneme yapın
settings.gradle
kodundaki depo bloğunun sonuncuya yerleştirerek girişi
dosyası olarak kaydedebilirsiniz. Çoğu durumda bu, gereksiz eklenti aramalarının sayısını en aza indirir ve
derleme hızınızı artırır.
Gradle'ın birden fazla depoda nasıl gezindiği hakkında daha fazla bilgi için bkz. Birden fazla depo bildirme inceleyebilirsiniz.
Hata ayıklama derlemenizde statik derleme yapılandırması değerlerini kullanın
hata ayıklama derleme türü
Dinamik sürüm kodlarını, sürüm adlarını, kaynakları veya manifest dosyasını değiştiren diğer derleme mantığı için tam bir uygulama derlemesi gerekir gerçekleştirebilmek için değişiklikleri denemeden önce Aksi takdirde, yalnızca yayındayken değiştirilmesi gerekir. Derleme yapılandırmanız bu tür bir dinamik özellikleri olup olmadığını, daha sonra bu özellikleri sürüm derleme varyantlarınızda aşağıdaki örnekte gösterildiği gibi, hata ayıklama derlemeleriniz için statik değerler:
... // Use a filter to apply onVariants() to a subset of the variants. onVariants(selector().withBuildType("release")) { variant -> // Because an app module can have multiple outputs when using multi-APK, versionCode // is only available on the variant output. // Gather the output when we are in single mode and there is no multi-APK. val mainOutput = variant.outputs.single { it.outputType == OutputType.SINGLE } // Create the version code generating task. val versionCodeTask = project.tasks.register("computeVersionCodeFor${variant.name}", VersionCodeTask::class.java) { it.outputFile.set(project.layout.buildDirectory.file("versionCode${variant.name}.txt")) } // Wire the version code from the task output. // map will create a lazy Provider that: // 1. Runs just before the consumer(s), ensuring that the producer (VersionCodeTask) has run // and therefore the file is created. // 2. Contains task dependency information so that the consumer(s) run after the producer. mainOutput.versionCode.set(versionCodeTask.flatMap { it.outputFile.map { it.asFile.readText().toInt() } }) } ... abstract class VersionCodeTask : DefaultTask() { @get:OutputFile abstract val outputFile: RegularFileProperty @TaskAction fun action() { outputFile.get().asFile.writeText("1.1.1") } }
Nasıl ayarlanacağını öğrenmek için GitHub'da setVersionsFromTask tarifine bakın. dinamik sürüm kodu ekleyebilirsiniz.
Statik bağımlılık sürümlerini kullanın
build.gradle
dosyalarınızda bağımlılık bildirirken dinamik sürümü kullanmaktan kaçının.
sayılar (sonunda artı işareti olan, örneğin 'com.android.tools.build:gradle:2.+'
).
Dinamik sürüm numaralarını kullanmak, beklenmedik sürüm güncellemelerine ve sürümün çözümlenmesinde zorluk yaşanmasına neden olabilir.
ve Gradle'ın güncellemeleri kontrol etmesinden kaynaklanan daha yavaş derlemelerdir.
Bunun yerine statik sürüm numaraları kullanın.
Kitaplık modülü oluşturma
Uygulamanızda Android kitaplık modülüne dönüştürebileceğiniz kodu arayın. Kodunuzu bu şekilde modüler hale getirmek, derleme sisteminin yalnızca ve bu çıkışları gelecekteki derlemeler için önbelleğe alabilirsiniz. Modülerleştirme aynı zamanda paralel proje yürütmeyi daha etkili şekilde yapabilirsiniz. o optimizasyonu etkinleştirin.
Özel derleme mantığı için görevler oluşturma
Derleme profili oluşturduktan sonra derleme
profili, derleme zamanının nispeten uzun bir bölümünün **Yapılandırma
Projeler** aşamasında, build.gradle
komut dosyalarınızı gözden geçirin ve
bir kod içerir. Derleme mantığını taşıyarak
gerektiğinde, görevin yalnızca gerektiğinde çalıştırılmasını ve sonuçların önbellekte
bu derleme mantığının paralel olarak çalıştırılmasına olanak tanır. Paralel proje yürütmeye izin verebilirsiniz. Özel derleme taks'i hakkında daha fazla bilgi edinmek için
resmi Gradle dokümanlarını okuyun.
İpucu: Derlemeniz çok sayıda özel görev içeriyorsa
özel görev sınıfları oluşturarak build.gradle
dosyalarınızdaki dağınıklığı ortadan kaldırmak istiyorsunuz. Sınıflarınızı
project-root/buildSrc/src/main/groovy/
dizini;
Gradle, sınıf yolundaki bu sınıfları otomatik olarak
Projenizde build.gradle
dosya var.
Resimleri WebP'ye dönüştürün
WebP, kullanıcılara kayıplı sıkıştırma (JPEG gibi) ve şeffaflık sağlayan biçim (PNG gibi). WebP, JPEG veya PNG'den daha iyi sıkıştırma sağlayabilir.
Derleme zamanında sıkıştırma yapmak zorunda kalmadan resim dosyası boyutlarını küçültme derlemelerinizi hızlandırabilir, özellikle de uygulamanız çok fazla resim kullanıyorsa kaynaklar. Ancak, çalışırken cihazın CPU kullanımında küçük bir artış WebP resimlerinin sıkıştırmasını açma. Android Studio'yu kullanarak resimlerinizi dönüştürün webP ile değiştirin.
PNG sıkıştırmasını devre dışı bırak
PNG'nizi dönüştürmezseniz resimlerinizi WebP'ye yükleyebilirsiniz, isterseniz otomatik resim sıkıştırmayı kullanabilirsiniz.
Android Gradle eklentisi 3.0.0 kullanıyorsanız
veya daha yüksek bir boyut, PNG sıkıştırması "hata ayıklama" işlemi için varsayılan olarak devre dışıdır derleme türü. Bunu devre dışı bırakmak için
diğer derleme türleri için optimizasyon yapmak istiyorsanız build.gradle
dosyanıza aşağıdakileri ekleyin:
Eski
android { buildTypes { release { // Disables PNG crunching for the "release" build type. crunchPngs false } } }
Kotlin
android { buildTypes { getByName("release") { // Disables PNG crunching for the "release" build type. isCrunchPngs = false } } }
Derleme türleri veya ürün aromaları bu özelliği tanımlamadığından,
ve sürümü oluştururken bu özelliği manuel olarak true
değerine ayarlayın
sürümünü kullanabilirsiniz.
JVM paralel çöp toplayıcı ile denemeler yapın
Derleme performansı, Gradle tarafından kullanılan optimum JVM atık toplayıcısı yapılandırılarak iyileştirilebilir. JDK 8 varsayılan olarak paralel çöp toplayıcıyı kullanacak şekilde yapılandırılmış olsa da JDK 9 ve sonraki sürümler, kullanmak üzere yapılandırıldı G1 çöp toplayıcı.
Derleme performansını artırabilmek için
Gradle derlemelerinizi test ederek
yardımcı olur. gradle.properties
içinde şunları ayarlayın:
org.gradle.jvmargs=-XX:+UseParallelGC
Bu alanda halihazırda ayarlanmış başka seçenekler varsa yeni bir seçenek ekleyin:
org.gradle.jvmargs=-Xmx1536m -XX:+UseParallelGC
Farklı yapılandırmalarla derleme hızını ölçmek için bkz. Derlemenizin profilini oluşturun.
JVM yığın boyutunu artırma
Yavaş derlemeler gözlemlerseniz ve özellikle çöp toplama işlemi, binanın depolama alanının% 15'inden
program geliştirme
Derleme Analiz Aracı
Java Sanal Makinesi (JVM) yığın boyutunu artırmanız gerekir.
gradle.properties
dosyasında sınırı 4, 6 veya 8 gigabayt olarak ayarlayın.
aşağıdaki örnekte gösterildiği gibi:
org.gradle.jvmargs=-Xmx6g
Ardından derleme hızını artırmak için test edin. İdeal yığını belirlemenin en kolay yolu sınırı az miktarda artırmak ve sonra yeterli derleme olup olmadığını test etmektir. hız artışı.
Ayrıca JVM paralel çöp toplayıcı, satırın tamamı şöyle görünmelidir:
org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g
JVM bellek hatalarını analiz etmek için HeapDumpOnOutOfMemoryError etkinleştirin. Bu sayede JVM, bellek tükendiğinde bir yığın dökümü oluşturur.
Geçişli olmayan R sınıflarını kullanma
Daha hızlı derlemeler için geçişli olmayan R
sınıfları kullanın
birden fazla modülü olan uygulamalar için geçerlidir. Bu sayede, kaynakların yinelenmesinin önüne geçilmesi ve
her modülün R
sınıfı,
ve bağımlılıklarını
fark edebilirsiniz. Bu sayede derlemeler daha hızlı yapılıp derlemenin avantajlarından yararlanabilir
kaçınılmazdır. Bu, Android Gradle eklentisi 8.0.0 ve sonraki sürümlerde varsayılan davranıştır.
Android Studio Bumblebee'den itibaren, geçişli olmayan R
sınıfları yeni projeler için varsayılan olarak etkindir.
Android Studio'nun önceki sürümleriyle oluşturulan projeleri, geçişli olmayan projeleri kullanacak şekilde güncelleyin
R
sınıfları Yeniden düzenle > Geçişli Olmayan R Sınıflarına Geçiş Yapın.
Uygulama kaynakları ve R
sınıfı hakkında daha fazla bilgi edinmek için bkz.
Uygulama kaynaklarına genel bakış.
Sabit olmayan R sınıflarını kullanma
Sabit olmayan R
sınıfı kullan
Java derlemesinin artımlılığını iyileştirmek için uygulama ve testlerdeki alanlar
ve kaynakların daha hassas bir şekilde küçültülmesine olanak sağlar. R
sınıf alanı
kaynaklar numaralandırıldığından kitaplıklar için her zaman sabit değildir.
APK'yı paketleme veya bu kitaplığa bağımlı testler gerçekleştirme.
Bu, Android Gradle Plugin 8.0.0 ve sonraki sürümlerde varsayılan davranıştır.
Jetifier işaretini devre dışı bırak
Çoğu proje doğrudan AndroidX kitaplıklarını kullandığından
Daha iyi derleme performansı için Jetifier işareti. Kaldırmak için
Jetifier flag'ini kaldırmak için android.enableJetifier=false
gradle.properties
dosya
Derleme Analiz Aracı, işaretin onaylanıp tamamlanmadığını iyi bir derleme performansı elde etmesini sağlamak ve bakımsız Android Destek kitaplıkları. Derleme Analiz Aracı hakkında daha fazla bilgi edinmek için Derleme performansı sorunlarını giderme.
Yapılandırma önbelleğini kullanma
İlgili içeriği oluşturmak için kullanılan yapılandırma önbelleği Gradle'ın derleme görevleri grafiğiyle ilgili bilgileri kaydedip sonraki derlemelerde yeniden kullanmasına olanak tanır. Gradle'ın derlemenin tamamını yeniden yapılandırması gerekmez.
Yapılandırma önbelleğini etkinleştirmek için şu adımları uygulayın:
- Tüm proje eklentilerinin uyumlu olduğundan emin olun.
Şunu kullanın: Derleme Analiz Aracı'nda projenizin yapılandırma önbelleğiyle uyumlu olduğundan emin olun. Derleme Analiz Aracı, bir dizi test ve özelliğin projede etkinleştirilip etkinleştirilemeyeceğini belirlemek için kullanılır. Görüntüleyin sorun #13490 desteklenen eklentilerin listesidir.
gradle.properties
dosyasına aşağıdaki kodu ekleyin:org.gradle.configuration-cache=true # Use this flag carefully, in case some of the plugins are not fully compatible. org.gradle.configuration-cache.problems=warn
Yapılandırma önbelleği etkinleştirildiğinde, projenizi ilk kez çalıştırdığınızda derleme çıkışı
diyor ki: Calculating task graph as no configuration cache is available for tasks
. Etkinlik sırasında
çalıştırmanız halinde derleme çıkışında Reusing configuration cache
değeri gösterilir.
Yapılandırma önbelleği hakkında daha fazla bilgi edinmek için Yapılandırma önbelleğe alma ayrıntılı incelemesi ve hakkındaki Gradle dokümanını yapılandırma önbelleği.
Gradle 8.1 ve Android Gradle Plugin 8.1'de kullanıma sunulan yapılandırma önbelleği sorunları
Yapılandırma önbelleği, Gradle 8.1'de kararlı hale geldi ve dosya API'sini kullanıma sundu.
izleyebilirsiniz. File.exists()
, File.isDirectory()
ve File.list()
gibi aramalar şunun tarafından kaydedilir:
Yapılandırma giriş dosyalarını izlemek için Gradle.
Android Gradle Plugin (AGP) 8.1, Gradle'ın kullanması gereken bazı dosyalar için bu File
API'lerini kullanır.
olarak kabul edilmez. Bu,
Gradle 8.1 ve sonraki sürümler, derleme performansını yavaşlatır.
Aşağıdakiler, AGP 8.1'de önbellek girişleri olarak kabul edilir:
Giriş | Sorun İzleyici | Sabitlendiği yer: |
$GRADLE_USER_HOME/android/FakeDependency.jar | Sorun No. 289232054 | AGP 8.2 |
cmake çıktısı | Sorun #287676077 | AGP 8.2 |
$GRADLE_USER_HOME/.android/analytics.settings | Sorun #278767328 | AGP 8.3 |
Bu API'leri veya bu API'leri kullanan bir eklenti kullanıyorsanız bazıları bu API'leri kullanarak mantık derlediği için derleme sürenizde bir regresyonla karşılaşabilirsiniz ek önbelleği geçersiz kılmayı tetikleyebilir. Lütfen bkz. Derleme yapılandırması giriş izlemedeki iyileştirmeler buradaki kalıpları ve derleme mantığının nasıl düzeltileceğini tartışmak veya dosya API izlemesi.