Derlemenizi profilleyin

Daha büyük projeler veya çok sayıda özel derleme mantığı uygulayanlar, performans sorunlarını tespit etmek için derleme sürecini daha ayrıntılı olarak incelemenizi gerektirebilir. Bunu, Gradle'ın derleme yaşam döngüsünün her aşamasını ve her derleme görevini yürütmesinin ne kadar sürdüğünü profil oluşturarak yapabilirsiniz. Örneğin, derleme profiliniz Gradle'ın projenizi yapılandırmak için çok fazla zaman harcadığını gösterirse özel derleme mantığını yapılandırma aşamasından taşımanız gerekebilir. Buna ek olarak, mergeDevDebugResources görevi derleme süresini çok fazla kullanıyorsa resimlerinizi WebP'ye dönüştürmeniz veya PNG işlemeyi devre dışı bırakmanız gerektiğini gösterebilir.

Android Studio 4.0 veya üzeri bir sürüm kullanıyorsanız derleme performansı sorunlarını incelemenin en iyi yolu Derleme Analiz Aracı'nı kullanmaktır.

Ayrıca derlemenizin profilini Android Studio dışında iki şekilde oluşturabilirsiniz:

  1. Derlemenizin derinlemesine analizi için sağlam bir araç olan bağımsız gradle-profiler aracı.

  2. Gradle komut satırından kullanılabilen kullanışlı bir araç olan Gradle --profile seçeneği.

Bağımsız gradle-profiler aracını kullanma

Size en iyi derleme hızını sağlayan proje kurulumunu bulmak için, Gradle derlemeleri için profil oluşturma ve karşılaştırma bilgilerini toplayan bir araç olan Gradle profiler'ı kullanmanız gerekir. Gradle profil aracı, derleme senaryoları oluşturmanıza ve bunları birden çok kez çalıştırmanıza olanak tanır. Böylece, sonuçlar arasındaki yüksek sapmaları önler ve sonuçların yeniden üretilebilirliğini sağlayabilirsiniz.

Temiz ve artımlı derlemeler hakkında bilgi toplamak için Karşılaştırma modu kullanılmalıdır. Bununla birlikte, CPU anlık görüntüleri de dahil olmak üzere çalıştırmalar hakkında daha ayrıntılı bilgiler toplamak için profil çıkarma modu kullanılabilir.

Karşılaştırma için bazı proje kurulumu yapılandırmalarından bazıları şunlardır:

  • Eklenti sürümleri
  • Gradle sürümleri
  • JVM ayarları (yığın boyutu, permgen boyutu, çöp toplama vb.)
  • Gradle çalışanı sayısı (org.gradle.workers.max)
  • Performansı daha da optimize etmek için eklenti başına seçenekler

Başlangıç

  • Bu talimatları uygulayarak gradle-profiler'ı yükleyin
  • Çalıştırma: gradle-profiler --benchmark --project-dir <root-project> :app:assembleDebug

--benchmark, projeyi aralarında değişiklik yapmadan birkaç kez çalıştırdığı için bu, tamamen güncel bir derlemeyi karşılaştırır. Ardından, profile-out/ dizini altında, derleme zamanlarını gösteren bir HTML raporu oluşturur.

Karşılaştırma yapmak için daha yararlı olabilecek başka senaryolar da vardır:

  • Çalışmanızın büyük bir kısmını yaptığınız bir sınıftaki yöntem gövdesinde kod değişiklikleri yapılır.
  • Projeniz boyunca kullanılan modüldeki API değişiklikleri. Kendi kodunuzda yaptığınız değişiklikten daha az sıklıkta olsa da, bunun daha büyük bir etkisi vardır ve bunu ölçmek yararlıdır.
  • Kullanıcı arayüzü çalışmasında yinelemeyi simüle etmek için düzen düzenlemeleri.
  • Çeviri işini simüle eden dize düzenlemeleri.
  • Derlemenin kendisinde yapılan değişiklikleri simüle eden temiz derlemeler (ör. Android Gradle eklenti güncellemesi, Gradle güncellemesi veya buildSrc altında kendi derleme kodunuzda yaptığınız düzenlemeler).

Bu kullanım alanlarını karşılaştırmak için gradle-profiler yürütmesini güçlendirmek amacıyla kullanılacak ve kaynaklarınıza uygun değişiklikleri uygulayacak bir senaryo oluşturabilirsiniz. Sık karşılaşılan senaryolardan bazılarını aşağıda inceleyebilirsiniz.

Farklı bellek/CPU ayarları için profil oluşturma

Farklı bellek ve CPU ayarlarını karşılaştırmak amacıyla org.gradle.jvmargs için farklı değerler kullanan birden fazla senaryo oluşturabilirsiniz. Örneğin, senaryolar oluşturabilirsiniz:

# <root-project>/scenarios.txt
clean_build_2gb_4workers {
    tasks = [":app:assembleDebug"]
    gradle-args = ["--max-workers=4"]
    jvm-args = ["-Xmx2048m"]
    cleanup-tasks = ["clean"]
}
clean_build_parallelGC {
    tasks = [":app:assembleDebug"]
    jvm-args = ["-XX:+UseParallelGC"]
    cleanup-tasks = ["clean"]
}

clean_build_G1GC_4gb {
    tasks = [":app:assembleDebug"]
    jvm-args = ["-Xmx4096m", "-XX:+UseG1GC"]
    cleanup-tasks = ["clean"]
}

gradle-profiler --benchmark --project-dir <root-project> --scenario-file scenarios.txt çalıştırıldığında üç senaryo çalıştırılır. Ayrıca :app:assembleDebug uygulamasının bu kurulumların her biri için ne kadar sürdüğünü karşılaştırabilirsiniz.

Farklı Gradle eklentisi sürümlerinde profil oluşturma

Gradle eklentisinin sürümünü değiştirmenin derleme sürelerini nasıl etkilediğini öğrenmek için, bunu karşılaştıracak bir senaryo oluşturun. Bu, eklenti sürümünü senaryodan eklenebilir hale getirmek için biraz hazırlık gerektirir. Kök build.gradle dosyanızı değiştirin:

# <root-project>/build.gradle
buildscript {
    def agpVersion = providers.systemProperty("agpVersion").forUseAtConfigurationTime().orNull ?: '4.1.0'

    ext.kotlin = providers.systemProperty('kotlinVersion').forUseAtConfigurationTime().orNull ?: '1.4.0'

    dependencies {
        classpath "com.android.tools.build:gradle:$agpVersion"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin"
    }
}

Artık senaryolar dosyasından Android Gradle eklentisi ve Kotlin Gradle eklentisi sürümlerini belirtebilir ve senaryonun, kaynak dosyalara yeni bir yöntem eklemesini sağlayabilirsiniz:

# <root-project>/scenarios.txt
non_abi_change_agp4.1.0_kotlin1.4.10 {
    tasks = [":app:assembleDebug"]
    apply-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
    System-properties {
      "agpVersion" = "4.1.0"
      "kotlinVersion" = "1.4.10"
}

non_abi_change_agp4.2.0_kotlin1.4.20 {
    tasks = [":app:assembleDebug"]
    apply-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
    System-properties {
      "agpVersion" = "4.2.0-alpha16"
      "kotlinVersion" = "1.4.20"
}

Artımlı derlemenin profilini oluşturma

Derlemelerin çoğu artımlı olduğundan bu, profil alınması en önemli senaryolardan biridir. Gradle profil aracı, artımlı derlemelerin profilden alınması için kapsamlı desteğe sahiptir. Bir yöntem gövdesini değiştirerek, yeni bir yöntem ekleyerek veya bir düzen ya da dize kaynağını değiştirerek değişiklikleri kaynak dosyaya otomatik olarak uygulayabilir. Örneğin, aşağıdaki gibi artımlı senaryolar oluşturabilirsiniz:

# <root-project>/scenarios.txt
non_abi_change {
    tasks = [":app:assembleDebug"]
    apply-non-abi-change-to = ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
}

abi_change {
    tasks = [":app:assembleDebug"]
    apply-abi-change-to = ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
}

layout_change {
    tasks = [":app:assembleDebug"]
    apply-android-layout-change-to = "app/src/main/res/your_layout_file.xml"
}
string_resource_change {
    tasks = [":app:assembleDebug"]
    apply-android-resource-value-change-to = "app/src/main/res/values/strings.xml"
}

gradle-profiler --benchmark --project-dir &lt;root-project> --scenario-file scenarios.txt çalıştırıldığında, karşılaştırma verilerini içeren HTML raporu oluşturulur.

Artımlı senaryoları yığın boyutu, çalışan sayısı veya Gradle sürümü gibi diğer ayarlarla birleştirebilirsiniz:

# <root-project>/scenarios.txt
non_abi_change_4g {
    tasks = [":app:assembleDebug"]
    apply-non-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
    jvm-args = ["-Xmx4096m"]
}

non_abi_change_4g_8workers {
    tasks = [":app:assembleDebug"]
    apply-non-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
    jvm-args = ["-Xmx4096m"]
    gradle-args = ["--max-workers=8"]
}

non_abi_change_3g_gradle67 {
    tasks = [":app:assembleDebug"]
    apply-non-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
    jvm-args = ["-Xmx3072m"]
    version = ["6.7"]
}

Düzgün bir derlemenin profilini oluşturma

Net bir derlemeyi karşılaştırmak için gradle profil aracı yürütmesini yönlendirmek üzere kullanılacak bir senaryo oluşturabilirsiniz:

# <root-project>/scenarios.txt
clean_build {
    tasks = [":app:assembleDebug"]
    cleanup-tasks = ["clean"]
}

Bu senaryoyu çalıştırmak için aşağıdaki komutu kullanın:

gradle-profiler --benchmark --project-dir <root-project> --scenario-file scenarios.txt

Gradle --profile seçeneğini kullanma

Gradle komut satırından derleme profili oluşturmak ve görüntülemek için aşağıdaki adımları uygulayın:

  1. Projenizin kök dizininde bir komut satırı terminali açın.
  2. Aşağıdaki komutu girerek temiz bir derleme yapın. Bir göreve (kaynak kod gibi) girişler (ör. kaynak kodu) değişmediğinde Gradle, derlemenizin profilini çıkarırken her derleme profili arasında temiz bir derleme gerçekleştirmeniz gerekir. Böylece, giriş değişikliği içermeyen ikinci bir derleme, görevler yeniden çalıştırılmadığı için her zaman daha hızlı çalışır. Bu nedenle, derlemeleriniz arasında clean görevini çalıştırmak tüm derleme sürecinin profilini çıkarmanızı sağlar.
    // On Mac or Linux, run the Gradle wrapper using "./gradlew".
    gradlew clean
    
  3. Aşağıdaki işaretleri kullanarak ürün çeşitlerinizden biri (ör. "geliştirici" aroması) için hata ayıklama derlemesi yürütün:
    gradlew --profile --offline --rerun-tasks assembleFlavorDebug
    
    • --profile: Profil oluşturmayı etkinleştirir.
    • --offline: Gradle'ın çevrimiçi bağımlılıkları getirmesini devre dışı bırakır. Bu da Gradle'ın bağımlılıklarınızı güncellemeye çalışmasından kaynaklanan gecikmelerin profil oluşturma verilerinizi etkilememesini sağlar. Gradle'ın bağımlılıklarınızı indirdiğinden ve önbelleğe aldığından emin olmak için projenizi bir kez derlemiş olmanız gerekir.
    • --rerun-tasks: Gradle'ı tüm görevleri yeniden çalıştırmaya ve görev optimizasyonlarını yoksaymaya zorlar.
  4. Şekil 1. Profil raporlarının konumunu gösteren proje görünümü.

    Derleme tamamlandıktan sonra, Proje penceresini kullanarak project-root/build/reports/profile/ dizinine (Şekil 1'de gösterildiği gibi) gidin.

  5. profile-timestamp.html dosyasını sağ tıklayın ve Tarayıcıda aç > Varsayılan'ı seçin. Rapor, şekil 2'de gösterilene benzer olmalıdır. Derlemeniz hakkında bilgi edinmek için rapordaki her sekmeyi inceleyebilirsiniz. Örneğin, Gradle'ın her derleme görevini ne kadar sürdüğünü gösteren Görev Yürütme sekmesi.

    2. Şekil. Raporu tarayıcıda görüntüleme.

  6. İsteğe bağlı: Projenizde veya derleme yapılandırmanızda herhangi bir değişiklik yapmadan önce 3. adımdaki komutu tekrarlayın ancak --rerun-tasks işaretini atlayın. GrafikUP-TO-DATE Örneğin, :app:processDevUniversalDebugManifest öğesi UP-TO-DATE olarak işaretlenmemişse derleme yapılandırmanızın manifesti her derlemede dinamik olarak güncellemekte olduğunu gösterebilir. Ancak her derleme sırasında :app:checkDevDebugManifest gibi bazı görevlerin çalışması gerekir.

    3. Şekil. Görev yürütme sonuçlarını görüntüleme.

Artık bir derleme profili raporunuza sahip olduğunuza göre, raporun her bir sekmesindeki bilgileri inceleyerek optimizasyon fırsatlarını aramaya başlayabilirsiniz. Faydalar projeler ve iş istasyonları arasında farklılık gösterebileceğinden bazı derleme ayarlarında deneme yapılması gerekir. Örneğin, kod tabanı büyük olan projelerde, kullanılmayan kodları kaldırmak ve uygulama boyutunu küçültmek için kod küçültme yönteminden yararlanılabilir. Ancak küçük projelerde kod daraltmayı tamamen devre dışı bırakmak daha faydalı olabilir. Ayrıca, Gradle yığın boyutunu artırmak ( org.gradle.jvmargs kullanılarak), düşük bellekli makinelerde performansı olumsuz yönde etkileyebilir.

Derleme yapılandırmanızda değişiklik yaptıktan sonra yukarıdaki adımları tekrarlayarak ve yeni bir derleme profili oluşturarak değişikliklerinizin sonuçlarını gözlemleyin. Örneğin Şekil 4'te, bu sayfada açıklanan temel optimizasyonların bazıları uygulandıktan sonra aynı örnek uygulama için bir rapor gösterilmektedir.

4. Şekil. Derleme hızını optimize ettikten sonra yeni bir rapor görüntüleme.