Derlemenizi profilleyin

Daha büyük projeler veya çok sayıda özel derleme mantığı uygulayan projeler, performans sorunlarını tespit etmek için derleme sürecini daha ayrıntılı olarak incelemeniz gerekir. Bunu, Gradle’ın projenin her aşamasını yürütmesinin ne kadar sürdüğünü öğrenerek yapabilirsiniz. derleme görevini üstlenirsiniz. Örneğin, derleme profiliniz Gradle'ın projeyi yapılandırmak için çok fazla zaman harcadığını gösterirse zaman çizelgesine sadık kalmak için özel derleme mantığını yapılandırma aşamasının dışına taşıma başlıklı makaleyi inceleyin. Ayrıca, mergeDevDebugResources görevi çok miktarda tüketiyorsa Bu durum, derleme süresi içinde resimlerinizi WebP'ye dönüştürme veya PNG birleştirmeyi devre dışı bırakın.

Şunu kullanıyorsanız: Derleme performansını araştırmanın en iyi yolu, Android Studio 4.0 veya sonraki sürümlerdir. sorununun önüne geçmek için Build Analiz Aracı'nı kullanabilirsiniz.

Ayrıca, Android Studio:

  1. Bağımsız gradle-profiler aracı, aracınızı kullanabilirsiniz.

  2. Gradle --profile seçeneği, kolayca kullanabileceğiniz bir araç.

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

Size en iyi derleme hızını sağlayan proje kurulumunu bulmak için Gradle profiler'ı, Gradle derlemeleri için profil çıkarma ve karşılaştırma bilgileri toplamak amacıyla kullanılan bir araçtır. Gradle profil aracı, derleme senaryoları oluşturmanızı ve bunları birden fazla şekilde çalıştırmanızı sağlar. sonuçlar arasındaki yüksek değişimi önler ve tekrarlanabilirlik sağlar. yardımcı olur.

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

Karşılaştırma için kullanılacak 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, atık toplama vb.)
  • Gradle çalışanı sayısı (org.gradle.workers.max)
  • Performansı daha da optimize etmek için eklentiye özel seçenekler

Başlarken

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

--benchmark, projeyi çalıştırdığı için tamamen güncel bir derlemeyi karşılaştırır. birden fazla kez teslim etmek sizin görevinizdir. Sonra da profile-out/ dizini altında, aşağıdaki verileri gösteren bir HTML raporu oluşturabilirsiniz: derleme süreleridir.

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

  • Kod, çalışmanızın çoğunu yaptığınız bir sınıftaki yöntem gövdesinde değişir.
  • Projeniz boyunca kullanılan bir modüldeki API değişiklikleri. Daha az olsa da daha sık değişiklik gösterirse, bunun etkisi daha büyüktür ölçmek için 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 etmek için dize düzenlemeleri.
  • Derlemenin kendisinde yapılan değişiklikleri simüle etmek için temiz derlemeler (ör. Android Gradle eklenti güncellemesi, Gradle güncellemesi veya kendi derleme kodunuzda yapılan düzenlemeler buildSrc altında).

Bu kullanım alanlarını karşılaştırmak için müşteriyle ilgili gradle-profiler yürütmesini yürütmek için kullanılır ve hangisinin uygun olduğu nasıl etkilediğini öğrenin. Sık karşılaşılan senaryolardan bazılarını aşağıda inceleyebilirsiniz.

Farklı bellek/CPU ayarlarında profil oluşturma

Farklı bellek ve CPU ayarlarını karşılaştırmak için org.gradle.jvmargs için farklı değerler kullanan birden fazla senaryo vardır. Örneğin, şöyle 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ılıyor üç senaryo senaryosu çalışır ve bu senaryoda ne kadar süre boyunca Bu kurulumların her biri için :app:assembleDebug çekimi yapılır.

Farklı Gradle eklentisi sürümlerinin profilini oluşturma

Gradle eklentisi sürümünün değiştirilmesinin, uygulamanızın bunu karşılaştırmak için bir senaryo oluşturun. Bunun için senaryodaki eklenti sürümünü enjekte edilebilir hale getirmek için hazırlık. Değiştir kök derleme.gradle dosyanız:

# <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 Android Gradle eklentisini ve Kotlin Gradle eklentisini belirtebilirsiniz. sürümlerini indirdikten sonra senaryonun kaynak dosyalar:

# <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ı bir derlemenin profilini oluşturma

Yapıların çoğu artımlı olduğundan bunu en önemli bazı senaryolar var. Gradle profil aracı, Artımlı derlemelerin profilini çıkarma Dosyadaki değişiklikleri kaynak dosyaya otomatik olarak uygulayabilir, yöntem gövdesi, yeni yöntem ekleme veya bir düzeni ya da dize kaynağını değiştirme. Örneğin, şuna benzer 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ılıyor karşılaştırma verilerini içeren bir HTML raporu oluşturur.

Artımlı senaryoları yığın boyutu, depolama alanı ve boyut gibi çalışan sayısı veya Gradle sürümü:

# <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"]
}

Temiz bir derlemenin profilini oluşturma

Temiz bir yapıyla kıyaslama yapmak için başarılı bir gradle-profil oluşturucunun yürütülmesini sağlamak için kullanılır:

# <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ği

Gradle komut satırından derleme profili oluşturmak ve görüntülemek için şu 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 gerçekleştirin. Profildeyken üzerinde çalıştığınız her derlemenin arasında çünkü bir göreve (kaynak kodu gibi) giriş yapıldığında Gradle unutmayın. Bu nedenle, giriş değişikliği içermeyen ikinci bir derleme her zaman daha hızlı çalışır çünkü yeniden yürütülmemesidir. Bu nedenle, clean görevi derlemeleriniz eksiksiz derleme süreci oluşturmanızı sağlar.
    // On Mac or Linux, run the Gradle wrapper using "./gradlew".
    gradlew clean
    
  3. Ürün aromalarınızdan birinde (ör. "dev" etiketi) bir hata ayıklama derlemesi yürütün aroma, şu işaretlerle:
    gradlew --profile --offline --rerun-tasks assembleFlavorDebug
    
    • --profile: Profil oluşturmayı etkinleştirir.
    • --offline: Gradle'ın çevrimiçi olmasını devre dışı bırakır ve bildirmeyi konuştuk. Bu, Gradle'ın neden olduğu gecikmelerden bağımlılıklarınızı güncellemeye çalışmanız, verileri temel alan araçlardır. Projenizi bir kez daha önce oluşturmuş, Gradle'ın bağımlılıklarınızı indirip önbelleğe aldığından emin olun.
    • --rerun-tasks: Gradle'ı tüm görevleri yeniden çalıştırmaya ve yoksaymaya zorlar zaman kazanabilirsiniz.
  4. Şekil 1. Projenin konumunu gösteren proje görünümü profil raporları.

    Derleme tamamlandıktan sonra Proje penceresini kullanarak project-root/build/reports/profile/ dizini ( Şekil 1'de gösterilmiştir).

  5. profile-timestamp.html dosyasını sağ tıklayıp seçin Tarayıcıda aç > Varsayılan'ı seçin. Rapor, öncekine benzer olmalıdır Şekil 2'de gösterilmiştir. Rapordaki her sekmeyi inceleyerek Örneğin, Gradle'ın ne kadar sürdüğünü gösteren Task Execution sekmesi her bir derleme görevini yürütebilirsiniz.

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

  6. İsteğe bağlı: Projenizde veya derlemenizde herhangi bir değişiklik yapmadan önce 3. adımdaki komutu tekrarlayın ancak --rerun-tasks işareti. Çünkü Gradle, e-postayla müşterilere girişleri değişmemiş görevleri yeniden yürütmek (bunlar Raporun Görev Yürütme sekmesinde UP-TO-DATE Şekil 3'te gösterildiği gibi), bu işlemleri gerçekleştirirken hangi görevlerin olmaması gerekir. Örneğin, :app:processDevUniversalDebugManifest şu şekilde işaretlenmemiş: UP-TO-DATE, derleme yapılandırmanızın manifesto her derlemede dinamik olarak güncellenir. Ancak bazı görevlerin her derleme sırasında (ör. :app:checkDevDebugManifest) çalışır.

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

Artık bir yapı profili raporunuz olduğuna göre, sayfasındaki bilgileri inceleyerek optimizasyon fırsatlarını rapordur. Avantajları sağlayabileceğinden bazı derleme ayarlarında deneme yapmak gerekir nasıl bir farklılık gösterdiğini öğrendik. Örneğin, Yeşil Ofis’te kod tabanı için kod küçültme yöntemi kullanılabilir kullanılmayan kodları kaldırıp uygulama boyutunu küçültün. Ancak, daha küçük kodların tamamen küçültülmesinin devre dışı bırakılmasından daha çok fayda sağlayabilir. Ayrıca, Gradle yığın boyutunu artırma ( org.gradle.jvmargs) 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şikliklerinizi uygulayın. Örneğin, Şekil 4'te aynı örnek uygulama uygulandıktan sonra elde edilen bir rapor gösterilmektedir optimizasyonlardan bazılarını ele alacağız.

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