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:
Bağımsız
gradle-profiler
aracı, aracınızı kullanabilirsiniz.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 <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:
- Projenizin kök dizininde bir komut satırı terminali açın.
- 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
- Ü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.
-
-
Derleme tamamlandıktan sonra Proje penceresini kullanarak
project-root/build/reports/profile/
dizini ( Şekil 1'de gösterilmiştir). -
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. -
İ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 sekmesindeUP-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.
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.