Điểm chuẩn trong tính năng Tích hợp liên tục

Bạn có thể chạy các phép đo điểm chuẩn trong tính năng Tích hợp liên tục (CI) để theo dõi hiệu suất theo thời gian và nhận diện trường hợp giảm (hoặc tăng) hiệu suất trước khi phát hành ứng dụng. Trang này cung cấp thông tin cơ bản về tính năng đo điểm chuẩn trong CI.

Trước khi bắt đầu đo điểm chuẩn trong CI, hãy cân nhắc sự khác biệt giữa việc thu thập và đánh giá kết quả so với hoạt động kiểm thử thông thường.

Kết quả không rõ ràng

Mặc dù điểm chuẩn là các phép kiểm thử đo lường, nhưng kết quả không chỉ đơn thuần là đạt/không đạt. Điểm chuẩn cung cấp các phép đo thời gian cho thiết bị cụ thể được thực hiện. Biểu diễn đồ thị kết quả theo thời gian cho phép bạn theo dõi sự thay đổi và quan sát độ nhiễu trong hệ thống đo lường.

Sử dụng thiết bị thực

Chạy các phép đo điểm chuẩn trên thiết bị Android thực. Mặc dù có thể chạy trên trình mô phỏng, nhưng bạn không nên làm như vậy vì phương pháp này không thể hiện được trải nghiệm người dùng thực tế. Thay vào đó, phương pháp này cung cấp các số liệu liên quan đến tính năng phần cứng và hệ điều hành của máy chủ. Hãy cân nhắc sử dụng các thiết bị thực hoặc một dịch vụ cho phép bạn tiến hành kiểm thử trên thiết bị thực, chẳng hạn như Phòng thử nghiệm Firebase.

Tiến hành đo điểm chuẩn

Việc tiến hành đo điểm chuẩn như một phần trong quy trình CI có thể khác với việc đo điểm chuẩn trên máy cục bộ từ Android Studio. Trên máy, bạn thường chạy các quá trình kiểm thử tích hợp của Android với một tác vụ connectedCheck Gradle. Tác vụ này tự động tạo APK và kiểm thử APK của bạn, đồng thời tiến hành kiểm thử trên (các) thiết bị được kết nối với máy chủ CI. Khi chạy trong CI, quy trình này thường cần được tách thành các giai đoạn riêng biệt.

Tạo

Đối với thư viện Microbenchmark, hãy chạy tác vụ Gradle assemble[VariantName]AndroidTest. Thao tác này sẽ tạo một APK kiểm thử chứa cả mã xử lý ứng dụng và mã đã kiểm thử của bạn.

Ngoài ra, thư viện Macrobenchmark yêu cầu bạn phải tạo APK mục tiêu và APK kiểm thử riêng biệt. Do đó, hãy chạy các tác vụ Gradle :app:assemble[VariantName]:macrobenchmark:assemble[VariantName].

Cài đặt và chạy

Các bước này thường được thực hiện mà không cần chạy tác vụ Gradle. Lưu ý rằng các bước này có thể được rút gọn tuỳ thuộc vào việc bạn có sử dụng một dịch vụ cho phép thực hiện kiểm thử trên thiết bị thực hay không.

Để cài đặt, hãy dùng lệnh adb install và chỉ định APK kiểm thử hoặc APK mục tiêu.

Chạy lệnh đo lường adb shell am để thực hiện tất cả các phép đo điểm chuẩn:

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

Khi sử dụng thư viện Macrobenchmark, hãy dùng androidx.test.runner.AndroidJUnitRunner thông thường làm trình chạy đo lường.

Bạn có thể truyền các đối số đo lường tương tự như trong cấu hình Gradle bằng đối số -e. Để biết tất cả các lựa chọn đối số đo lường, hãy xem Đối số đo lường Microbenchmark hoặc Thêm đối số đo lường cho Macrobenchmark.

Ví dụ: bạn có thể đặt đối số dryRunMode để chạy các phép đo điểm chuẩn vi mô trong quy trình xác minh yêu cầu lấy dữ liệu (pull request). Khi kích hoạt cờ hiệu này, phép đo điểm chuẩn vi mô chỉ chạy trong một vòng lặp, xác minh rằng chúng đang chạy đúng cách mà không mất quá nhiều thời gian thực thi.

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

Để biết thêm thông tin về cách chạy kiểm thử đo lường từ dòng lệnh, hãy xem phần Chạy kiểm thử bằng ADB.

Khoá xung nhịp

Trình bổ trợ Gradle Microbenchmark (Điểm chuẩn vi mô) cung cấp lệnh ./gradlew lockClocks để khoá xung nhịp CPU của một thiết bị đã bị can thiệp hệ thống. Thao tác này rất hữu ích nhằm đảm bảo độ ổn định khi bạn có quyền truy cập thiết bị đã bị can thiệp hệ thống, chẳng hạn như bản dựng "userdebug". Bạn có thể thực hiện việc này bằng tập lệnh shell lockClocks.sh có trong nguồn của thư viện.

Bạn có thể chạy tập lệnh trực tiếp từ máy chủ Linux hoặc Mac, hoặc bạn có thể đẩy sang thiết bị bằng một vài lệnh 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

Nếu bạn chạy tập lệnh shell trực tiếp trên một máy chủ lưu trữ, các lệnh này sẽ được gửi đến một thiết bị đã kết nối.

Để biết thêm thông tin về lý do tại sao việc khoá xung nhịp CPU lại hữu ích, hãy xem cách đạt điểm chuẩn nhất quán.

Thu thập kết quả

Các thư viện đo điểm chuẩn sẽ xuất kết quả đo lường dưới dạng JSON, cùng với các dấu vết phân tích vào một thư mục trên thiết bị Android sau mỗi lần chạy phép đo điểm chuẩn. Thư viện Macrobenchmark sẽ xuất ra nhiều tệp theo dõi perfetto: mỗi tệp cho một lần lặp lại được đo lường của mỗi vòng lặp MacrobenchmarkRule.measureRepeated. Tuy nhiên, Microbenchmark chỉ tạo một tệp theo dõi cho mọi lần lặp lại của mỗi BenchmarkRule.measureRepeated. Các tệp theo dõi phân tích cũng được xuất vào cùng thư mục này.

Lưu và định vị tệp

Nếu bạn chạy phép đo điểm chuẩn với Gradle, các tệp này sẽ tự động được sao chép vào thư mục đầu ra của máy tính lưu trữ trong build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/.

Nếu chạy trực tiếp bằng lệnh adb, bạn cần kéo các tệp đó theo cách thủ công. Theo mặc định, các báo cáo được lưu trên thiết bị trong thư mục media (đa phương tiện) của bộ nhớ ngoài của ứng dụng đã kiểm thử. Để thuận tiện, thư viện sẽ in đường dẫn của tệp vào Logcat. Xin lưu ý rằng thư mục đầu ra có thể khác nhau, tuỳ thuộc vào phiên bản Android của thiết bị đang chạy phép đo điểm chuẩn.

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

Bạn cũng có thể định cấu hình vị trí lưu báo cáo điểm chuẩn trên thiết bị bằng đối số đo lường additionalTestOutputDir. Thư mục này phải là thư mục có thể ghi bởi ứng dụng của bạn.

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

Trên Android 10 (API cấp 29) trở lên, các quá trình kiểm thử ứng dụng sẽ chạy trong một hộp cát lưu trữ theo mặc định để ngăn ứng dụng của bạn truy cập vào các tệp bên ngoài thư mục dành riêng cho ứng dụng. Để có thể lưu vào một thư mục chung, chẳng hạn như /sdcard/Download, hãy truyền đối số đo lường sau:

-e no-isolated-storage true

Bạn cũng phải cho phép các lựa chọn lưu trữ cũ trong tệp kê khai điểm chuẩn của mình một cách rõ ràng:

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

Để biết thêm thông tin, hãy xem mục Tạm thời chọn không sử dụng bộ nhớ có giới hạn.

Truy xuất tệp

Để truy xuất các tệp đã tạo từ thiết bị, hãy dùng lệnh adb pull để đưa tệp cụ thể vào thư mục hiện tại trên máy chủ lưu trữ của mình:

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

Để truy xuất tất cả benchmarkData từ một thư mục cụ thể, hãy xem đoạn mã sau:

# 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

Các tệp theo dõi (.trace hoặc .perfetto-trace) được lưu vào cùng một thư mục với benchmarkData.json, do đó, bạn có thể thu thập các tệp này theo cách tương tự.

Ví dụ về dữ liệu điểm chuẩn

Thư viện điểm chuẩn tạo tệp JSON chứa thông tin về thiết bị mà nó đang chạy phép đo điểm chuẩn và các phép đo điểm chuẩn thực tế đã chạy. Đoạn mã sau thể hiện tệp JSON đã tạo:

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

Tài nguyên khác