Viết một Macrobenchmark

Sử dụng thư viện Macrobenchmark để thử nghiệm các trường hợp sử dụng lớn hơn trong ứng dụng của bạn, bao gồm cả việc khởi động ứng dụng và các thao tác giao diện người dùng phức tạp, chẳng hạn như cuộn RecyclerView hoặc chạy ảnh động. Nếu bạn muốn thử nghiệm các khu vực nhỏ hơn trong mã của mình, hãy tham khảo Thư viện Điểm chuẩn vĩ mô.

Thư viện sẽ cung cấp các kết quả đo điểm chuẩn cho cả bảng điều khiển của Android Studio và tệp JSON chứa nhiều thông tin chi tiết hơn. Lớp này cũng cung cấp các tệp theo dõi mà bạn có thể tải và phân tích trong Android Studio.

Bạn cũng có thể sử dụng thư viện Macrobenchmark trong môi trường tích hợp liên tục (CI) như mô tả trong bài viết Chạy điểm chuẩn trong tính năng Tích hợp liên tục.

Thiết lập dự án

Bạn nên sử dụng Macrobenchmark với phiên bản Android Studio mới nhất (Bumblebee 2021.1.1 trở lên), vì có các tính năng mới trong phiên bản đó của IDE tích hợp với Macrobenchmark.

Thiết lập mô-đun Macrobenchmark

Điểm chuẩn vĩ mô cần một mô-đun com.android.test, tách biệt với mã ứng dụng của bạn, chịu trách nhiệm chạy các thử nghiệm đo lường ứng dụng của bạn.

Bumblebee (hoặc mới hơn)

Trong Android Studio Bumblebee 2021.1.1, một mẫu có sẵn để đơn giản hóa quá trình thiết lập mô-đun Macrobenchmark. Mẫu mô-đun đo điểm chuẩn sẽ tự động tạo mô-đun trong dự án của bạn để đo lường ứng dụng do một mô-đun ứng dụng tạo, bao gồm cả điểm chuẩn khởi động mẫu.

Để tạo mẫu mô-đun mới và tạo mô-đun mới, hãy làm như sau:

  1. Nhấp chuột phải vào dự án hoặc mô-đun của bạn trong bảng Dự án trong Android Studio và nhấp vào Mới > Mô-đun.

  2. Chọn Điểm chuẩn từ ngăn Mẫu.

  3. Bạn có thể tùy chỉnh ứng dụng mục tiêu (ứng dụng sẽ được đo điểm chuẩn), cũng như tên gói và mô-đun cho mô-đun macrobenchmark mới.

  4. Nhấp vào Hoàn tất.

Mẫu mô-đun điểm chuẩn

Arctic Fox

Trong Arctic Fox, bạn sẽ tạo một mô-đun thư viện và chuyển đổi mô-đun đó thành một mô-đun thử nghiệm.

  1. Nhấp chuột phải vào dự án hoặc mô-đun của bạn trong bảng Dự án trong Android Studio và nhấp vào Mới > Mô-đun.
  2. Chọn Thư viện Android trong ngăn Mẫu.
  3. Nhập macrobenchmark cho tên mô-đun.
  4. Đặt SDK tối thiểu thành API 23: Android M
  5. Nhấp vào Hoàn tất.

Định cấu hình mô-đun thư viện mới

Sửa đổi tệp Gradle

Tùy chỉnh build.gradle của mô-đun Macrobenchmark như sau:

  1. Thay đổi plugin từ com.android.library thành com.android.test.
    apply plugin 'com.android.test'
  2. Thêm các thuộc tính mô-đun thử nghiệm bắt buộc khác trong khối android {}:

    Groovy

    android {
        // ...
        // Note that your module name may have different name
        targetProjectPath = ":app"
        // Enable the benchmark to run separately from the app process
        experimentalProperties["android.experimental.self-instrumenting"] = true
    
        buildTypes {
            // declare a build type to match the target app's build type
            benchmark {
                debuggable = true
                signingConfig = debug.signingConfig
            }
        }
    }
      

    Kotlin

    android {
        // ...
        // Note that your module name may have different name
        targetProjectPath = ":app"
        // Enable the benchmark to run separately from the app process
        experimentalProperties["android.experimental.self-instrumenting"] = true
    
        buildTypes {
            // declare a build type to match the target app's build type
            create("benchmark") {
                isDebuggable = true
                signingConfig = signingConfigs.getByName("debug")
            }
        }
    }
      

  3. Thay đổi tất cả các phần phụ thuộc tên testImplementation hoặc androidTestImplementation thành implementation.
  4. Thêm phần phụ thuộc vào thư viện Macrobenchmark:
    implementation 'androidx.benchmark:benchmark-macro-junit4:1.1.0-beta03'
  5. Chỉ cho phép kiểu dựng benchmark của mô-đun này. Sau khối android{}, nhưng trước khối dependencies{}, thêm:

    Groovy

    androidComponents {
        beforeVariants(selector().all()) {
            // enable only the benchmark buildType, since we only want to measure close to release performance
            enabled = buildType == 'benchmark'
        }
    }
      

    Kotlin

    androidComponents {
        beforeVariants {
            // enable only the benchmark buildType, since we only want to measure close to release performance
            it.enable = it.buildType == "benchmark"
        }
    }
      
  6. Đơn giản hóa cấu trúc thư mục.

    Trong mô-đun com.android.test, chỉ có một thư mục nguồn, cho tất cả thử nghiệm. Xóa các thư mục nguồn khác, bao gồm src/testsrc/androidTest, vì các thư mục này không được sử dụng.

Thiết lập ứng dụng

Để đo điểm chuẩn cho một ứng dụng (gọi là mục tiêu của điểm chuẩn vĩ mô), ứng dụng đó phải là profileable để có thể đọc thông tin theo dõi chi tiết. Bật tính năng này trong thẻ <application> trên AndroidManifest.xml của ứng dụng.

<!-- enable profiling by macrobenchmark -->
<profileable
    android:shell="true"
    tools:targetApi="q" />

Định cấu hình ứng dụng đo điểm chuẩn càng gần phiên bản phát hành (hoặc phiên bản chính thức) càng tốt. Thiết lập ứng dụng này là không thể gỡ lỗi và nên bật tính năng giảm kích thước để cải thiện hiệu suất. Bạn thường làm điều này bằng cách tạo một bản sao của biến thể phát hành, biến thể này hoạt động theo cách tương tự, nhưng được ký cục bộ bằng các khóa gỡ lỗi. Ngoài ra, bạn có thể dùng initWith để hướng dẫn Gradle thực hiện việc này cho bạn:

Groovy

buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }

    benchmark {
        initWith buildTypes.release
        signingConfig signingConfigs.debug

Kotlin

buildTypes {
    getByName("release") {
        isMinifyEnabled = true
        isShrinkResources = true
        proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"))
    }

    create("benchmark") {
        initWith(getByName("release"))
        signingConfig = signingConfigs.getByName("debug")
    }
}

Thực hiện đồng bộ hóa Gradle, mở bảng điều khiển Tạo các biến thể ở bên trái, và chọn biến thể điểm chuẩn của cả ứng dụng và mô-đun Macrobenchmark. Điều này đảm bảo việc chạy điểm chuẩn sẽ xây dựng và thử nghiệm đúng biến thể của ứng dụng của bạn:

Chọn biến thể điểm chuẩn

Thiết lập ứng dụng nhiều mô-đun

Nếu ứng dụng của bạn có nhiều mô-đun Gradle, bạn cần đảm bảo tập lệnh bản dựng sẽ biết biến thể bản dựng nào cần biên dịch. Nếu không có tùy chọn này, bản dựng benchmark mới được thêm vào sẽ khiến bản dựng này không hoạt động và cung cấp thông báo lỗi sau:

> Could not resolve project :shared.
     Required by:
         project :app
      > No matching variant of project :shared was found.

Bạn có thể khắc phục vấn đề này bằng cách thêm thuộc tính matchingFallbacks vào loại bản dựng benchmark của các mô-đun :macrobenchmark:app. Phần còn lại của các mô-đun Gradle có thể có cấu hình giống như trước đây.

Groovy

benchmark {
    initWith buildTypes.release
    signingConfig signingConfigs.debug

    matchingFallbacks = ['release']
}

Kotlin

create("benchmark") {
    initWith(getByName("release"))
    signingConfig = signingConfigs.getByName("debug")

    matchingFallbacks += listOf('release')
}

Khi chọn các biến thể bản dựng trong dự án, hãy chọn benchmark cho :app:macrobenchmark mô-đun, còn release cho mọi mô-đun khác mà bạn có trong ứng dụng, như bạn thấy trong phần hình ảnh sau:

Các biến thể điểm chuẩn cho dự án nhiều mô-đun có bản phát hành và điểm chuẩn đã chọn

Để biết thêm thông tin, hãy xem quản lý phần phụ thuộc dựa trên biến thể.

Tạo loại macrobenchmark

Quy trình kiểm tra điểm chuẩn được cung cấp thông qua API quy tắc MacrobenchmarkRule JUnit4 trong thư viện Macrobenchmark. Phương thức này chứa phương thức measureRepeated cho phép bạn chỉ định các điều kiện khác nhau về cách chạy và đo điểm chuẩn ứng dụng mục tiêu.

Bạn cần ít nhất chỉ định packageName của ứng dụng mục tiêu, metrics nội dung bạn muốn đo lường và số iterations điểm chuẩn sẽ chạy.

Kotlin

@LargeTest
@RunWith(AndroidJUnit4::class)
class SampleStartupBenchmark {
    @get:Rule
    val benchmarkRule = MacrobenchmarkRule()

    @Test
    fun startup() = benchmarkRule.measureRepeated(
        packageName = TARGET_PACKAGE,
        metrics = listOf(StartupTimingMetric()),
        iterations = 5,
        setupBlock = {
            // Press home button before each run to ensure the starting activity isn't visible.
            pressHome()
        }
    ) {
        // starts default launch activity
        startActivityAndWait()
    }
}

Java

@LargeTest
@RunWith(AndroidJUnit4.class)
public class SampleStartupBenchmark {
    @Rule
    public MacrobenchmarkRule benchmarkRule = new MacrobenchmarkRule();

    @Test
    public void startup() {
        benchmarkRule.measureRepeated(
            /* packageName */ TARGET_PACKAGE,
            /* metrics */ Arrays.asList(new StartupTimingMetric()),
            /* iterations */ 5,
            /* measureBlock */ scope -> {
                // starts default launch activity
                scope.startActivityAndWait();
                return Unit.INSTANCE;
            }
        );
    }
}

Để biết mọi tùy chọn về cách tùy chỉnh điểm chuẩn, hãy xem Tùy chỉnh điểm chuẩn.

Chạy điểm chuẩn

Chạy thử nghiệm từ trong Android Studio để đo lường hiệu suất của ứng dụng trên thiết bị của bạn. Bạn có thể chạy các điểm chuẩn giống như cách bạn chạy bất kỳ @Test nào khác bằng cách sử dụng hành động máng xối bên cạnh lớp học hoặc phương thức kiểm tra, như được hiển thị trong hình ảnh sau đây.

Chạy macrobenchmark với thao tác máng xối bên cạnh lớp thử nghiệm

Bạn cũng có thể chạy tất cả các điểm chuẩn trong một mô-đun Gradle từ dòng lệnh bằng cách thực thi lệnh connectedCheck:

./gradlew :macrobenchmark:connectedCheck

Hoặc để chạy một thử nghiệm đơn lẻ:

./gradlew :macrobenchmark:connectedCheck -P android.testInstrumentationRunnerArguments.class=com.example.macrobenchmark.startup.SampleStartupBenchmark#startup

Hãy xem mục Đo điểm chuẩn trong CI để biết thông tin về cách chạy và theo dõi điểm chuẩn trong quá trình tích hợp liên tục.

Kết quả điểm chuẩn

Sau khi chạy thành công điểm chuẩn, các chỉ số được hiển thị trực tiếp trong Android Studio và cũng là kết quả để sử dụng CI trong tệp JSON. Mỗi lần lặp được đo đều thu được một dấu vết hệ thống riêng biệt. Bạn có thể mở các dấu vết kết quả này bằng cách nhấp vào một trong các đường liên kết trong ngăn Kết quả kiểm tra, như hiển thị trong hình ảnh sau.

Kết quả khởi động Macrobenchmark

Khi dấu vết được tải, Android Studio sẽ nhắc bạn chọn quy trình để phân tích. Phần để chọn được điền sẵn bằng quy trình ứng dụng mục tiêu:

Lựa chọn quy trình theo dõi Studio

Sau khi tệp theo dõi được tải, Studio sẽ hiển thị kết quả trong công cụ trình phân tích tài nguyên CPU:

Dấu vết Studio

Truy cập các tệp theo dõi theo cách thủ công

Nếu bạn đang sử dụng phiên bản Android Studio cũ (trước Arctic Fox 2020.3.1) hoặc muốn sử dụng công cụ Perfetto để phân tích tệp theo dõi, thì có các bước bổ sung cần thực hiện. Perfetto cho phép bạn kiểm tra tất cả các quá trình diễn ra trên thiết bị trong quá trình theo dõi, trong khi trình phân tích tài nguyên CPU của Android Studio giới hạn việc kiểm tra một quy trình duy nhất.

Nếu bạn gọi các thử nghiệm từ Android Studio hoặc sử dụng dòng lệnh Gradle, các tệp theo dõi sẽ tự động được sao chép từ thiết bị này sang máy chủ lưu trữ. Những thông tin này được ghi trên máy chủ lưu trữ tại:

project_root/module/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/device_id/TrivialStartupBenchmark_startup[mode=COLD]_iter002.perfetto-trace

Sau khi đã có tệp theo dõi trên hệ thống lưu trữ của mình, bạn có thể mở tệp đó trong Android Studio bằng Tệp > Mở trong trình đơn. Thao tác này sẽ hiển thị chế độ xem công cụ phân tích tài liệu trong mục trước.

Lỗi cấu hình

Nếu ứng dụng được định cấu hình sai (có thể gỡ lỗi hoặc không thể định cấu hình), Macrobenchmark sẽ trả về lỗi thay vì báo cáo phép đo không chính xác hoặc không đầy đủ. Bạn có thể chặn các lỗi này bằng đối số androidx.benchmark.suppressErrors.

Lỗi cũng được tạo ra khi cố gắng đo lường trình mô phỏng hoặc trên thiết bị pin yếu, vì điều này có thể ảnh hưởng đến khả năng hoạt động cốt lõi và tốc độ xung nhịp.

Tùy chỉnh điểm chuẩn

Hàm measureRepeated chấp nhận nhiều thông số ảnh hưởng đến các chỉ số mà thư viện đã thu thập, cách ứng dụng của bạn bắt đầu và được biên dịch, hoặc số lần lặp lại mà điểm chuẩn sẽ chạy.

Ghi lại chỉ số

Chỉ số là loại thông tin chính được lấy từ các điểm chuẩn của bạn. Các tùy chọn hiện có là StartupTimingMetric, FrameTimingMetricTraceSectionMetric. Để xem thêm thông tin về các chỉ số đó, hãy xem trang Ghi lại các chỉ số.

Cải thiện dữ liệu theo dõi bằng các sự kiện tùy chỉnh

Bạn có thể sử dụng phương pháp này để đo lường sự kiện theo dõi tùy chỉnh cho ứng dụng của mình, là các sự kiện hiển thị cùng với phần còn lại của báo cáo theo dõi và có thể giúp chỉ ra các sự cố cụ thể cho ứng dụng của bạn. Để tìm hiểu thêm về cách tạo sự kiện theo dõi tùy chỉnh, hãy xem hướng dẫn Xác định sự kiện tùy chỉnh.

Chế độ biên dịch

Các điểm chuẩn vĩ mô có thể chỉ định một Chế độ biên dịch. xác định lượng ứng dụng cần được tổng hợp trước từ mã DEX (định dạng mã byte trong một APK) thành mã máy (tương tự như trước được biên dịch C++).

Theo mặc định, điểm chuẩn macro được chạy bằng CompilationMode.DEFAULT, sẽ cài đặt Hồ sơ cơ sở (nếu có) trên Android 7 (API cấp 24) trở lên. Nếu bạn đang sử dụng Android 6 (API cấp 23) trở xuống, thì chế độ biên dịch sẽ tổng hợp APK dưới dạng hoạt động mặc định của hệ thống.

Bạn có thể cài đặt Hồ sơ cơ sở nếu ứng dụng đích chứa cả Hồ sơ cơ sở và thư viện ProfileInstaller.

Trên Android 7 trở lên, bạn có thể tùy chỉnh CompilationMode để ảnh hưởng đến số lượng quá trình tổng hợp trước trên thiết bị nhằm bắt chước các cấp độ khác nhau của quá trình biên dịch Ahead Of Time (AOT) hoặc lưu vào bộ nhớ đệm JIT. Hãy xem CompilationMode.Full, CompilationMode.PartialCompilationMode.None.

Chức năng này được xây dựng dựa trên lệnh biên dịch ART. Mỗi điểm chuẩn xóa dữ liệu hồ sơ trước khi bắt đầu, để đảm bảo mức độ can thiệp giữa các điểm chuẩn.

Chế độ khởi động

Để bắt đầu một hoạt động, bạn có thể chuyển sang chế độ khởi động được xác định trước (một trong COLD, WARM hoặc HOT). Thông số này thay đổi cách hoạt động chạy và trạng thái của quá trình khi bắt đầu thử nghiệm.

Để tìm hiểu thêm về các hình thức khởi động, hãy xem tài liệu về cách khởi động Android Vitals

Mẫu

Một dự án mẫu có sẵn như một phần kho lưu trữ mẫu android/hiệu suất trên GitHub.

Cung cấp phản hồi

Để báo cáo vấn đề hoặc gửi yêu cầu về tính năng cho Jetpack Macrobenchmark, hãy xem trình theo dõi vấn đề công khai.