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:
Derlemenizin derinlemesine analizi için sağlam bir araç olan bağımsız
gradle-profiler
aracı.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 <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:
- Projenizin kök dizininde bir komut satırı terminali açın.
- 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
- 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.
-
-
Derleme tamamlandıktan sonra, Proje penceresini kullanarak
project-root/build/reports/profile/
dizinine (Şekil 1'de gösterildiği gibi) gidin. -
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. -
İ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
öğesiUP-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.
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.