معیار در یکپارچگی مداوم

می‌توانید معیارهایی را در Continuous Integration (CI) اجرا کنید تا عملکرد را در طول زمان ردیابی کنید و پیش از انتشار برنامه‌تان، رگرسیون‌ها یا بهبودها را تشخیص دهید. در این صفحه اطلاعات اولیه در مورد بنچمارک در CI ارائه می شود.

قبل از شروع بنچمارک در CI، تفاوت گرفتن و ارزیابی نتایج را با تست های معمولی در نظر بگیرید.

نتایج فازی

اگرچه معیارها تست های ابزاری هستند، اما نتایج فقط یک قبولی یا شکست نیستند. بنچمارک ها اندازه گیری های زمان بندی را برای دستگاه معینی که روی آن کار می کنند ارائه می دهند. نمودار نتایج در طول زمان به شما امکان می دهد تغییرات را کنترل کرده و نویز را در سیستم اندازه گیری مشاهده کنید.

از دستگاه های واقعی استفاده کنید

بنچمارک ها را در دستگاه های فیزیکی اندروید اجرا کنید. در حالی که آنها می توانند روی شبیه سازها اجرا شوند، به شدت منع می شود زیرا تجربه کاربری واقعی را نشان نمی دهد و در عوض اعداد مرتبط با سیستم عامل میزبان و قابلیت های سخت افزاری را ارائه می دهد. استفاده از دستگاه‌های واقعی یا سرویسی را در نظر بگیرید که به شما امکان می‌دهد آزمایش‌ها را روی دستگاه‌های واقعی مانند Firebase Test Lab انجام دهید.

بنچمارک ها را اجرا کنید

اجرای معیارها به عنوان بخشی از خط لوله CI ممکن است با اجرای محلی آن از Android Studio متفاوت باشد. به صورت محلی، معمولاً تست های یکپارچه سازی اندروید را با یک کار connectedCheck اجرا می کنید. این کار به‌طور خودکار APK و APK آزمایشی شما را می‌سازد و آزمایش‌ها را روی دستگاه(های) متصل به سرور CI اجرا می‌کند. هنگام اجرا در CI، این جریان معمولاً باید به فازهای جداگانه تقسیم شود.

ساخت

برای کتابخانه Microbenchmark، Gradle task assemble[VariantName]AndroidTest را اجرا کنید، که APK آزمایشی شما را ایجاد می کند که شامل کد برنامه و همچنین کد آزمایش شده شما است.

از طرف دیگر، کتابخانه Macrobenchmark از شما می‌خواهد که APK هدف خود را بسازید و APK را جداگانه آزمایش کنید. بنابراین وظایف :app:assemble[VariantName] و :macrobenchmark:assemble[VariantName] Gradle را اجرا کنید.

نصب و اجرا کنید

این مراحل معمولاً بدون نیاز به اجرای وظایف Gradle انجام می شود. توجه داشته باشید، بسته به اینکه آیا از سرویسی استفاده می‌کنید که به شما امکان می‌دهد آزمایش‌ها را روی دستگاه‌های واقعی انجام دهید، ممکن است انتزاع شوند.

برای نصب از دستور adb install استفاده کنید و APK آزمایشی یا APK هدف را مشخص کنید.

دستور adb shell am instrument را اجرا کنید تا همه بنچمارک ها اجرا شوند:

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

هنگام استفاده از کتابخانه Macrobenchmark، از androidx.test.runner.AndroidJUnitRunner معمولی به عنوان ابزار دقیق استفاده کنید.

می‌توانید همان آرگومان‌های ابزار دقیقی را که در پیکربندی Gradle وجود دارد با استفاده از -e ارسال کنید. برای همه گزینه های آرگومان های ابزار دقیق، آرگومان های ابزار دقیق Microbenchmark یا افزودن آرگومان های ابزار دقیق برای Macrobenchmark را ببینید.

به عنوان مثال، می‌توانید آرگومان dryRunMode را برای اجرای میکروبنچمارک‌ها به عنوان بخشی از فرآیند تأیید درخواست pull خود تنظیم کنید. با فعال بودن این پرچم، میکروبنچمارک‌ها فقط در یک حلقه اجرا می‌شوند و تأیید می‌کنند که به درستی اجرا می‌شوند اما اجرای آن خیلی طول نمی‌کشد.

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

برای اطلاعات بیشتر در مورد نحوه اجرای تست‌های ابزار دقیق از خط فرمان، به اجرای تست‌ها با ADB مراجعه کنید.

قفل ساعت ها

پلاگین Microbenchmark Gradle دستور ./gradlew lockClocks برای قفل کردن ساعت های CPU یک دستگاه روت شده ارائه می دهد. این برای اطمینان از ثبات زمانی که به دستگاه‌های روت شده، مانند بیلدهای «userdbug» دسترسی دارید، مفید است. می توانید این را با اسکریپت پوسته lockClocks.sh که در منبع کتابخانه موجود است تکرار کنید.

می‌توانید اسکریپت را مستقیماً از یک میزبان لینوکس یا مک اجرا کنید، یا می‌توانید با چند دستور 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

اگر اسکریپت پوسته را مستقیماً روی یک میزبان اجرا کنید، این دستورات را به یک دستگاه متصل ارسال می کند.

برای کسب اطلاعات بیشتر در مورد اینکه چرا قفل کردن ساعت‌های CPU مفید است، نحوه بدست آوردن معیارهای ثابت را ببینید.

نتایج را جمع آوری کنید

کتابخانه‌های محک‌گذاری، اندازه‌گیری‌های خروجی را در JSON به همراه نمایه‌سازی ردیابی‌ها به فهرستی در دستگاه مجهز به Android پس از هر اجرای محک انجام می‌دهند. کتابخانه Macrobenchmark چندین فایل ردیابی perfetto را خروجی می دهد: یکی در هر تکرار اندازه گیری شده از هر حلقه MacrobenchmarkRule.measureRepeated . Microbenchmark ، با این حال، فقط یک فایل ردیابی برای تمام تکرارهای هر BenchmarkRule.measureRepeated ایجاد می کند. فایل های ردیابی پروفایل نیز به همین دایرکتوری خروجی می شوند.

فایل ها را ذخیره و پیدا کنید

اگر معیارها را با Gradle اجرا کنید، این فایل‌ها به‌طور خودکار در فهرست خروجی‌های کامپیوتر میزبان شما در زیر build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/ کپی می‌شوند.

اگر مستقیماً با دستور adb اجرا می شود، باید فایل ها را به صورت دستی بکشید. به‌طور پیش‌فرض، گزارش‌ها بر روی دستگاه در فهرست رسانه ذخیره‌سازی خارجی برنامه آزمایش‌شده ذخیره می‌شوند. برای راحتی، کتابخانه مسیر فایل را در Logcat چاپ می کند. توجه داشته باشید که بسته به اینکه بنچمارک ها در کدام نسخه اندروید اجرا می شوند، پوشه خروجی ممکن است متفاوت باشد.

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 (سطح API 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 حاوی اطلاعاتی درباره دستگاهی که معیارها را روی آن اجرا می‌کرد و معیارهای واقعی که اجرا می‌کرد تولید می‌کنند. قطعه زیر فایل 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
        }
    ]
}

منابع اضافی

{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% آخر کلمه %}