Derleme hızınızı optimize etme

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:

  1. Birkaç örnekle derleme yapılandırmanızı optimize edin doğrudan fayda sağlayan adımlar bunlardır.
  2. 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:

  1. 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.

  2. 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.