Sürekli Entegrasyonda Karşılaştırma

Sürekli Entegrasyon (CI) üzerinde karşılaştırmalar çalıştırarak veya performans regresyonlarını (ya da iyileştirmeleri) fark etmeden kullanıma hazır hale getirir. Bu sayfada, karşılaştırma hakkında temel bilgiler verilmektedir. CI'da mevcut.

CI'da karşılaştırma yapmaya başlamadan önce kaliteyi yakalama ve sonuçların değerlendirilmesi normal testlerden farklıdır.

Bulanık sonuçlar

Karşılaştırmalar kullanılan araçlarla yapılan testler olsa da, alınan sonuçlar başarılı ya da başarısız değildir. Karşılaştırmalar, çalıştırıldıkları cihaz için zamanlama ölçümleri sağlar. Zaman içinde ortaya çıkan sonuçların grafiğini çizmek, ilgili bölgedeki değişimi izleyebilir ve ölçüm sistemidir.

Gerçek cihazlar kullanın

Fiziksel Android cihazlarda karşılaştırmalar yapın. Bir projenin gerçekçi bir analizi temsil etmediği için, kullanıcı deneyimi sunar ve bunun yerine ana makine işletim sistemine ve donanımına özellikler. Gerçek cihazlar veya test yapmanıza olanak tanıyan bir hizmet kullanmayı düşünün Firebase Test Lab gibi gerçek cihazlarda test edin.

Karşılaştırma yapın

Karşılaştırmaları, CI ardışık düzeninizin bir parçası olarak çalıştırmak bunu yerel olarak yapabilirsiniz. Yerel olarak genellikle Android entegrasyon testleri için bir Gradle connectedCheck görevi kullanın. Bu görev otomatik olarak APK'nızı oluşturur ve test APK'nızı oluşturur ve CI sunucusudur. CI'da çalışırken bu akışın genellikle ayrı aşamalar olabilir.

Topluluk

Microbenchmark kitaplığı için Gradle görevini çalıştırın assemble[VariantName]AndroidTest, şunu içeren test APK'nızı oluşturur: hem uygulama kodunuza hem de test ettiğiniz koda yükseltin.

Alternatif olarak, Macrobenchmark kitaplığı hedef APK'nızı oluşturmanızı ve test APK'sını ayrı olarak test edin. Bu nedenle, :app:assemble[VariantName] ve :macrobenchmark:assemble[VariantName] Gradle görevleri.

Yükle ve çalıştır

Bu adımlar genellikle Gradle görevlerini çalıştırmaya gerek kalmadan gerçekleştirilir. Not: testler çalıştırmanıza olanak tanıyan bir hizmet kullanıp kullanmadığınıza bağlı olarak soyutlanabilir gerçek cihazlarda çalışır.

Yükleme için adb install komutunu kullanın ve test APK'sını belirtin. veya hedef APK'yı seçin.

Tüm karşılaştırmaları çalıştırmak için adb shell am araç komutunu çalıştırın:

adb shell am instrument -w com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

Macrobenchmark kitaplığını kullanırken normal androidx.test.runner.AndroidJUnitRunner enstrümantasyon koşucusu.

Gradle yapılandırmasındakiyle aynı araç bağımsız değişkenlerini aktarabilirsiniz -e bağımsız değişkeni kullanılıyor. Tüm araç bağımsız değişkenleri için bkz. Mikro Karşılaştırma Aracı Bağımsız Değişkenleri veya Macrobenchmark için araç bağımsız değişkenleri ekleyin.

Örneğin, dryRunMode bağımsız değişkenini mikrobenchmark'ları şu şekilde çalıştıracak şekilde ayarlayabilirsiniz: . Bu işaret etkinleştirildiğinde, Mikrobenchmark'lar yalnızca tek döngüde çalışarak çalıştıklarını doğrular ama yürütülmesi çok uzun sürmeyecek.

adb shell am instrument -w -e "androidx.benchmark.dryRunMode.enable" "true" com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

nasıl çalıştıracağınızla ilgili araç testlerini öğrenmek için ADB ile test çalıştırma bölümüne bakın.

Saatleri kilitle

Microbenchmark Gradle eklentisi, aşağıdakileri yapmak için ./gradlew lockClocks komutunu sağlar: rootlanmış bir cihazın CPU saatlerini kilitle. Kararlılığın sağlanması açısından faydalıdır "userdebug" gibi rootlanmış cihazlara erişiminiz olduğunda inşa eder. Şunları yapabilirsiniz: bu komutulockClocks.sh kitaplık kaynağı.

Komut dosyasını doğrudan bir Linux veya Mac ana bilgisayarından çalıştırabilir ya da birkaç adb komutuyla cihaza ekleyebilirsiniz:

adb push path/lockClocks.sh /data/local/tmp/lockClocks.sh
adb shell /data/local/tmp/lockClocks.sh
adb shell rm /data/local/tmp/lockClocks.sh

Kabuk komut dosyasını doğrudan bir ana makinede çalıştırırsanız bu komutları bağlı bir cihazdır.

CPU saatlerini kilitlemenin neden yararlı olduğu konusunda daha fazla bilgi için Tutarlı karşılaştırmalar elde edebilirsiniz.

Sonuçları toplayın

Karşılaştırma kitaplıkları, JSON ile birlikte bir dizinde profil oluşturma Android destekli cihaz gösterilir. Macrobenchmark kitaplığı birden fazla perfetto izleme dosyası üretir: Her öğenin ölçülen yinelemesi başına bir adet MacrobenchmarkRule.measureRepeated döngü. Ancak microbenchmark, her yineleme için yalnızca bir izleme dosyası BenchmarkRule.measureRepeated. Profil oluşturma izleme dosyalarının çıktısı da emin olmanız gerekir.

Dosyaları kaydedin ve bulun

Karşılaştırmaları Gradle ile çalıştırırsanız bu dosyalar otomatik olarak ana makine bilgisayarınızın çıkış dizinini oluşturur. build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/

Doğrudan adb komutuyla çalıştırıyorsanız dosyaları çekmeniz gerekir manuel olarak ekleyin. Varsayılan olarak, raporlar cihaza, şuranın medya dizinine kaydedilir: test edilen uygulamanın harici depolama alanındaki Kolaylık sağlamak için kütüphane yolu yazdırır dosyasını Logcat'e yükleyin. Çıkış klasörünün lisansa bağlı olarak değişebileceğini unutmayın. karşılaştırmaların hangi Android sürümünde çalıştığını gösterebilir.

Benchmark: writing results to /storage/emulated/0/Android/media/com.example.macrobenchmark/com.example.macrobenchmark-benchmarkData.json

Ayrıca, karşılaştırma raporlarının kaydedileceği konumu da cihaz bağımsız değişkenini kullanarak additionalTestOutputDir. Bu klasörünüz, uygulamanız tarafından yazılabilir olmalıdır.

adb shell am instrument -w -e additionalTestOutputDir /sdcard/Download/ com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

Android 10 (API düzeyi 29) ve sonraki sürümlerde uygulamanızın testleri bir depolama alanında çalışır korumalı alan, uygulamanızın dizine ekler. Global bir dizine kaydedebilmek için, örneğin /sdcard/Download olarak aşağıdaki enstrümantasyonu geçin bağımsız değişken:

-e no-isolated-storage true

Ayrıca, karşılaştırma ayarlarınızda eski depolama alanı seçeneklerine manifesto:

<application android:requestLegacyExternalStorage="true" ... >

Daha fazla bilgi için Geçici olarak kapsam dışında kalmayı seçin depolama alanı.

Dosyaları alma

Oluşturulan dosyaları cihazdan almak için adb pull kullanın. komutuna ekleyerek, belirtilen dosyayı ana makinenizdeki geçerli dizine çeker:

adb pull /storage/emulated/0/Android/media/com.example.macrobenchmark/com.example.macrobenchmark-benchmarkData.json

Belirtilen bir klasörden tüm benchmarkData öğelerini almak için aşağıdaki snippet:

# The following command pulls all files ending in -benchmarkData.json from the directory
# hierarchy starting at the root /storage/emulated/0/Android.
adb shell find /sdcard/Download -name "*-benchmarkData.json" | tr -d '\r' | xargs -n1 adb pull

İzleme dosyaları (.trace veya .perfetto-trace) aynı benchmarkData.json olarak işaretleyeceği için bu dosyaları aynı şekilde toplayabilirsiniz.

Karşılaştırma verileri örneği

Karşılaştırma kitaplıkları, şu bilgileri içeren JSON dosyaları oluşturur: karşılaştırmaları ve çalıştırıldığı gerçek karşılaştırmaları gösterir. İlgili içeriği oluşturmak için kullanılan aşağıdaki snippet, oluşturulan JSON dosyasını temsil eder:

{
    "context": {
        "build": {
            "brand": "google",
            "device": "blueline",
            "fingerprint": "google/blueline/blueline:12/SP1A.210812.015/7679548:user/release-keys",
            "model": "Pixel 3",
            "version": {
                "sdk": 31
            }
        },
        "cpuCoreCount": 8,
        "cpuLocked": false,
        "cpuMaxFreqHz": 2803200000,
        "memTotalBytes": 3753299968,
        "sustainedPerformanceModeEnabled": false
    },
    "benchmarks": [
        {
            "name": "startup",
            "params": {},
            "className": "com.example.macrobenchmark.startup.SampleStartupBenchmark",
            "totalRunTimeNs": 4975598256,
            "metrics": {
                "timeToInitialDisplayMs": {
                    "minimum": 347.881076,
                    "maximum": 347.881076,
                    "median": 347.881076,
                    "runs": [
                        347.881076
                    ]
                }
            },
            "sampledMetrics": {},
            "warmupIterations": 0,
            "repeatIterations": 3,
            "thermalThrottleSleepSeconds": 0
        }
    ]
}

Ek kaynaklar

ziyaret edin. ziyaret edin.