कंटिन्यूअस इंटिग्रेशन में बेंचमार्क

आप चाहें, तो कंटिन्यूअस इंटिग्रेशन (सीआई) में मानदंड चलाएं और इससे पहले कि परफ़ॉर्मेंस में हुए बदलावों या सुधारों को पहचान लिया जा सके. रिलीज़ भी हो सकती है. इस पेज पर मानदंड के बारे में बुनियादी जानकारी दी गई है CI में.

सीआई में मानदंड के साथ शुरू करने से पहले, इस बात पर विचार करें कि नतीजों का आकलन करना, सामान्य टेस्ट से अलग होता है.

अस्पष्ट परिणाम

हालांकि, मानदंड इंस्ट्रुमेंट्ड टेस्ट होते हैं, लेकिन नतीजे सिर्फ़ पास या फ़ेल नहीं होते. मानदंड उस डिवाइस के लिए समय की माप प्रदान करते हैं, जिस पर वे चलाए जाते हैं. समय के साथ नतीजों का ग्राफ़ बनाने से, आप कन्वर्ज़न पर नज़र रख सकते हैं और मेज़रमेंट सिस्टम.

असल डिवाइसों का इस्तेमाल करें

फ़िज़िकल Android डिवाइसों पर मानक लागू करना. हालांकि, वे इस पर काम कर सकते हैं एम्युलेटर का इस्तेमाल नहीं किया जाता, तो यह बिलकुल सही नहीं है, क्योंकि यह असल दुनिया जैसा नहीं है उपयोगकर्ता अनुभव उपलब्ध कराता है और इसके बजाय, होस्ट ओएस और हार्डवेयर से जुड़े नंबर देता है सुविधाएं. असली डिवाइस या ऐसी सेवा का इस्तेमाल करें जिससे आपको जांच करने में मदद मिले जैसे Firebase टेस्ट लैब.

मानदंड चलाएं

अपनी सीआई पाइपलाइन के हिस्से के तौर पर बेंचमार्क की जांच करना, दौड़ने से अलग हो सकता है इसे Android Studio से ऐक्सेस किया जा सकता है. स्थानीय तौर पर, आम तौर पर Android एक Gradle connectedCheck टास्क के साथ इंटिग्रेशन टेस्ट. यह टास्क अपने-आप आपका APK और टेस्ट APK बनाता है. साथ ही, इससे कनेक्ट किए गए डिवाइस(डिवाइसों) पर जांच करता है CI सर्वर पर जाकर. CI में चलते समय, आम तौर पर इस फ़्लो को अलग-अलग चरणों का पालन करें.

बनाएं

माइक्रोबेंचमार्क लाइब्रेरी के लिए, Gradle टास्क चलाएं assemble[VariantName]AndroidTest, जो आपका ऐसा टेस्ट APK बनाता है जिसमें यह शामिल है आपके ऐप्लिकेशन कोड और परीक्षण किए गए कोड, दोनों का इस्तेमाल किया जा सकता है.

वैकल्पिक रूप से, मैक्रोबेंचमार्क लाइब्रेरी के लिए आपको अपना लक्ष्य APK बनाना होगा और APK को अलग से टेस्ट कर सकते हैं. इसलिए, :app:assemble[VariantName] और :macrobenchmark:assemble[VariantName] Gradle टास्क.

इंस्टॉल करें और चलाएं

आम तौर पर, यह तरीका Gradle टास्क चलाए बिना ही पूरा किया जाता है. ध्यान दें, उन्हें अलग-अलग दिखाया जा सकता है. यह इस बात पर निर्भर करता है कि टेस्ट करने की अनुमति देने वाली सेवा का इस्तेमाल किया जाता है या नहीं लाइव स्ट्रीम करने में मदद करता है.

इंस्टॉल करने के लिए, adb install निर्देश का इस्तेमाल करें और टेस्ट APK के बारे में जानकारी दें या टारगेट APK का होना चाहिए.

सभी मानदंड चलाने के लिए adb shell am इंस्ट्रुमेंट कमांड चलाएं:

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

मैक्रोबेंचमार्क लाइब्रेरी का इस्तेमाल करते समय, सामान्य इंस्ट्रुमेंटेशन रनर के तौर पर androidx.test.runner.AndroidJUnitRunner ने बनाया.

आपके पास एक ही इंस्ट्रुमेंटेशन आर्ग्युमेंट को Gradle कॉन्फ़िगरेशन में पास करने का विकल्प है -e आर्ग्युमेंट का इस्तेमाल किया जा रहा है. इंस्ट्रुमेंटेशन के सभी आर्ग्युमेंट के विकल्पों के लिए, देखें माइक्रोबेंचमार्क इंस्ट्रुमेंटेशन आर्ग्यूमेंट या मैक्रोबेंचमार्क के लिए, इंस्ट्रुमेंटेशन आर्ग्युमेंट जोड़ें.

उदाहरण के लिए, माइक्रोबेंचमार्क को चलाने के लिए, dryRunMode आर्ग्युमेंट को इस तरह सेट किया जा सकता है: पुल अनुरोध की पुष्टि करने की प्रक्रिया का हिस्सा है. इस फ़्लैग को चालू करके, माइक्रोबेंचमार्क सिर्फ़ एक लूप में चलते हैं. इससे यह पुष्टि होती है कि वे चालू हैं लेकिन उन्हें लागू करने में ज़्यादा समय नहीं लगता.

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

दौड़ने के तरीके के बारे में ज़्यादा जानकारी पाने के लिए, कमांड लाइन से इंस्ट्रुमेंटेशन टेस्ट, ADB की मदद से टेस्ट करना देखें.

घड़ियां लॉक करें

माइक्रोबेंचमार्क Gradle प्लग इन, ./gradlew lockClocks कमांड देता है, ताकि रूट किए गए डिवाइस की सीपीयू घड़ियों को लॉक करना. यह स्थिरता बनाए रखने में मदद करता है जब आपके पास रूट किए गए डिवाइसों का ऐक्सेस हो, जैसे कि "userdebug" बिल्ड. आप इसे lockClocks.sh शेल स्क्रिप्ट की मदद से दोहराएं, जो लाइब्रेरी का सोर्स.

आप या तो स्क्रिप्ट को सीधे Linux या Mac होस्ट से चला सकते हैं या आप कुछ adb निर्देशों वाले डिवाइस से कनेक्ट करें:

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

अगर शेल स्क्रिप्ट को सीधे किसी होस्ट पर चलाया जाता है, तो यह इन कमांड को कनेक्ट किया गया डिवाइस.

सीपीयू घड़ियों को लॉक करना क्यों मददगार होता है, इस बारे में ज़्यादा जानकारी के लिए, एक जैसे मानदंड पाना.

नतीजे इकट्ठा करें

मानदंड लाइब्रेरी के आउटपुट माप इसमें JSON, जिसमें इसमें मौजूद डायरेक्ट्री के लिए प्रोफ़ाइलिंग ट्रेस शामिल हैं हर बेंचमार्क के हिसाब से, Android पर चलने वाले डिवाइस को प्राथमिकता दी जाती है. Macrobenchmark लाइब्रेरी एक से ज़्यादा परफ़ेटो ट्रेस फ़ाइलें जनरेट करता है: हर एक इटरेशन की मापी गई फ़ाइल के हिसाब से एक फ़ाइल MacrobenchmarkRule.measureRepeated लूप. हालांकि, माइक्रोबेंचमार्क की मदद से, हर एक बार की जाने वाली जानकारी के लिए सिर्फ़ एक ट्रेस फ़ाइल BenchmarkRule.measureRepeated. प्रोफ़ाइल में शामिल करना ट्रेस फ़ाइलें भी यही डायरेक्ट्री.

फ़ाइलें सेव करें और उनकी जगह की जानकारी पाएं

अगर Gradle के साथ मानदंड चलाया जाता है, तो ये फ़ाइलें अपने-आप में आपके होस्ट कंप्यूटर की आउटपुट डायरेक्ट्री build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/.

अगर आप सीधे adb निर्देश का इस्तेमाल कर रहे हैं, तो आपको फ़ाइलों को खींचना होगा मैन्युअल रूप से. डिफ़ॉल्ट रूप से, ये रिपोर्ट डिवाइस में इस डिवाइस की मीडिया डायरेक्ट्री में सेव की जाती हैं टेस्ट किए गए ऐप्लिकेशन का बाहरी स्टोरेज. सुविधा के लिए, लाइब्रेरी पाथ को प्रिंट करती है फ़ाइल को Logcat में ले जाता है. ध्यान दें कि आउटपुट फ़ोल्डर, कौनसा Android वर्शन है जिस पर मानदंड चल रहे हैं.

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

उस जगह को भी कॉन्फ़िगर किया जा सकता है जहां मानदंड की रिपोर्ट सेव की जाती हैं इंस्ट्रुमेंटेशन आर्ग्युमेंट additionalTestOutputDir का इस्तेमाल करने वाला डिवाइस. यह फ़ोल्डर ऐसा होना चाहिए जिसे आपके ऐप्लिकेशन से लिखा जा सके.

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

Android 10 (एपीआई लेवल 29) और उसके बाद के वर्शन पर, आपके ऐप्लिकेशन की जांच स्टोरेज में चलती है डिफ़ॉल्ट रूप से सैंडबॉक्स करता है, जो आपके ऐप्लिकेशन को खास तौर पर ऐप्लिकेशन के लिए बनाई गई डायरेक्ट्री पर. ग्लोबल डायरेक्ट्री में सेव करने के लिए, जैसे /sdcard/Download के तौर पर, नीचे दिए गए इंस्ट्रुमेंटेशन को पास करें तर्क:

-e no-isolated-storage true

आपको अपने मानदंड में लेगसी स्टोरेज के विकल्पों को साफ़ तौर पर अनुमति देनी होगी मेनिफ़ेस्ट:

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

ज़्यादा जानकारी के लिए, दायरे से कुछ समय के लिए ऑप्ट-आउट करना देखें डिवाइस की मेमोरी पर टैप करें.

फ़ाइलें वापस लाएं

डिवाइस से जनरेट की गई फ़ाइलों को वापस पाने के लिए, adb pull का इस्तेमाल करें कमांड, जो बताई गई फ़ाइल को आपके होस्ट की मौजूदा डायरेक्ट्री में ले आता है:

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

किसी खास फ़ोल्डर से सभी benchmarkData वापस पाने के लिए, स्निपेट:

# 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

ट्रेस फ़ाइलें (.trace या .perfetto-trace) उसी फ़ोल्डर को benchmarkData.json के तौर पर सेव करते हैं, तो आप उन्हें इसी तरह इकट्ठा कर सकते हैं.

बेंचमार्क डेटा का उदाहरण

बेंचमार्क लाइब्रेरी वह डिवाइस जिन पर बेंचमार्क और उन वास्तविक बेंचमार्क को चलाया जा रहा था. कॉन्टेंट बनाने नीचे दिया गया स्निपेट, जनरेट की गई JSON फ़ाइल दिखाता है:

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

अन्य संसाधन