Viết một Macrobenchmark

Sử dụng thư viện Macrobenchmark để kiểm thử các trường hợp sử dụng lớn hơn trong ứng dụng, 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 kiểm thử các khu vực nhỏ trong mã của mình, hãy tham khảo Thư viện Microbenchmark.

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

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 môi trường Tích hợp liên tục.

Bạn có thể tạo Cấu hình cơ sở bằng Macrobenchmark. Hãy làm theo hướng dẫn bên dưới để thiết lập thư viện Marcobenchmark rồi sau đó tạo một Cấu hình cơ sở.

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, vì phiên bản mới có các tính năng 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ã nguồn của ứng dụng, chịu trách nhiệm chạy các kiểm thử đo lường ứng dụng.

Trong Android Studio, đã có sẵn một mẫu để đơn giản hoá 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ột 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 ra, bao gồm cả điểm chuẩn khởi động mẫu.

Cách dùng mẫu mô-đun để tạo mô-đun mới:

  1. Nhấp chuột phải vào dự án hoặc mô-đun của bạn trong bảng điều khiển Project (Dự án) trong Android Studio rồi nhấp vào New > Module (Mới > Mô-đun).

  2. Chọn Benchmark (Điểm chuẩn) trong ngăn Templates (Mẫu).

  3. Bạn có thể tuỳ 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 Finish (Hoàn tất).

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

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 profileable (cho phép đọc thông tin theo dõi chi tiết mà không làm ảnh hưởng đến hiệu suất). Trình hướng dẫn mô-đun sẽ tự động thêm thẻ <profileable> vào tệp AndroidManifest.xml của ứng dụng.

Đị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 công khai) càng tốt. Thiết lập ứng dụng này ở dạng 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. Nhà phát triể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 có hiệu suất tương tự, nhưng được ký cục bộ bằng các khoá gỡ lỗi. Ngoài ra, bạn có thể dùng initWith để hướng dẫn Gradle làm việc này cho bạn:

Groovy

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

    create("benchmark") {
        initWith(release)
        signingConfig = signingConfigs.getByName("debug")
        proguardFiles("benchmark-rules.pro")
    }
}

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ộ hoá Gradle, mở bảng điều khiển Build Variants (Biến thể bản dựng) ở 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 tiến hành đo điểm chuẩn sẽ tạo và kiểm thử đúng biến thể ứng dụng của bạn:

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

(Không bắt buộc) Thiết lập ứng dụng nhiều mô-đun

Nếu ứng dụng có nhiều mô-đun Gradle, bạn cần đảm bảo tập lệnh bản dựng biết phải biên dịch biến thể bản dựng nào. Nếu không có tuỳ chọn này, buildType benchmark mới được thêm vào sẽ khiến bản dựng này không hoạt động và hiển thị 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 buildType 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 các mô-đun :app:macrobenchmark, còn release cho mọi mô-đun khác mà bạn có trong ứng dụng, như bạn thấy trong hình sau:

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

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

(Không bắt buộc) Thiết lập phiên bản sản phẩm

Nếu đã đặt nhiều phiên bản sản phẩm trong ứng dụng, bạn cần định cấu hình mô-đun :macrobenchmark để mô-đun đó biết cần tạo và đo điểm chuẩn theo phiên bản sản phẩm nào của ứng dụng. Nếu không có cấu hình này, bạn có thể gặp lỗi bản dựng từng xảy ra ở nhiều mô-đun Gradle:

Could not determine the dependencies of task ':macrobenchmark:connectedBenchmarkAndroidTest'.
> Could not determine the dependencies of null.
   > Could not resolve all task dependencies for configuration ':macrobenchmark:benchmarkTestedApks'.
      > Could not resolve project :app.
        Required by:
            project :macrobenchmark
         > The consumer was configured to find a runtime of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'benchmark', attribute 'com.android.build.api.attributes.AgpVersionAttr' with value '7.3.0'. However we cannot choose between the following variants of project :app:
             - demoBenchmarkRuntimeElements
             - productionBenchmarkRuntimeElements
           All of them match the consumer attributes:
           ...

Hướng dẫn này sử dụng 2 phiên bản sản phẩm trong mô-đun :appdemoproduction như bạn thấy ở đoạn mã sau:

Groovy

flavorDimensions 'environment'
productFlavors {
    demo {
        dimension 'environment'
        // ...
    }

    production {
        dimension 'environment'
        // ...
    }
}

Kotlin

flavorDimensions += "environment"
productFlavors {
    create("demo") {
        dimension = "environment"
        // ...
    }
    create("production") {
        dimension = "environment"
        // ...
    }
}

Có hai cách để định cấu hình đo điểm chuẩn với nhiều phiên bản sản phẩm:

Sử dụng missingDimensionStrategy

Việc chỉ định missingDimensionStrategy trong defaultConfig trong mô-đun :macrobenchmark sẽ yêu cầu hệ thống xây dựng trả về nhóm phiên bản dự phòng. Bạn cần chỉ định sử dụng nhóm phiên bản nào nếu trong mô-đun không có nhóm phiên bản. Trong ví dụ sau, phiên bản production được dùng làm nhóm mặc định:

Groovy

defaultConfig {
    missingDimensionStrategy "environment", "production"
}

Kotlin

defaultConfig {
    missingDimensionStrategy("environment", "production")
}

Bằng cách này, mô-đun :macrobenchmark chỉ có thể tạo và đo điểm chuẩn phiên bản sản phẩm đã chỉ định. Đây là việc hữu ích nếu bạn biết rằng chỉ một phiên bản sản phẩm có cấu hình phù hợp để được đo điểm chuẩn.

Xác định phiên bản sản phẩm trong mô-đun :macrobenchmark

Nếu muốn tạo và đo điểm chuẩn các phiên bản sản phẩm khác, bạn cần xác định chúng trong mô-đun :macrobenchmark. Việc xác định này cũng tương tự như trong mô-đun :app, nhưng chỉ gán productFlavors cho một dimension -- không cần có chế độ cài đặt nào khác:

Groovy

flavorDimensions 'environment'
productFlavors {
    demo {
        dimension 'environment'
    }

    production {
        dimension 'environment'
    }
}

Kotlin

flavorDimensions += "environment"
productFlavors {
    create("demo") {
        dimension = "environment"
    }
    create("production") {
        dimension = "environment"
    }
}

Sau khi xác định và đồng bộ hoá dự án, chọn biến thể bản dựng mong muốn trong ngăn Build Variants (Biến thể bản dựng):

Các biến thể điểm chuẩn cho dự án có phiên bản sản phẩm hiển thị productionBenchmark và bản phát hành đã chọn

Để biết thêm thông tin, xem bài viết Giải quyết lỗi bản dựng liên quan đến việc so khớp biến thể.

Tạo lớp macrobenchmark

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

Ít nhất bạn cần chỉ định packageName của ứng dụng mục tiêu, bạn muốn đo lường metrics nào và điểm chuẩn phải chạy bao nhiêu iterations.

Kotlin

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

    @Test
    fun startup() = benchmarkRule.measureRepeated(
        packageName = TARGET_PACKAGE,
        metrics = listOf(StartupTimingMetric()),
        iterations = DEFAULT_ITERATIONS,
        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 lựa chọn về cách tuỳ chỉnh điểm chuẩn, hãy xem mục Tuỳ chỉnh điểm chuẩn.

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

Chạy kiểm thử 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 định hướng bên cạnh lớp hoặc phương thức kiểm thử, như hiển thị trong hình ảnh sau đây.

Chạy macrobenchmark với hành động định hướng bên cạnh lớp kiểm thử

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ả đo điểm chuẩn

Sau khi chạy thành công điểm chuẩn, các chỉ số 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 thử, 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 CPU:

Dấu vết Studio

Các báo cáo JSON và mọi dấu vết lập hồ sơ cũng được tự động sao chép từ thiết bị sang máy chủ lưu trữ. Những nội dung 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/

Truy cập thủ công vào tệp theo dõi

Nếu muốn sử dụng công cụ Perfetto để phân tích tệp theo dõi, bạn có thể thực hiện các bước bổ sung. Perfetto cho phép bạn kiểm tra tất cả các quy 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 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 bài kiểm thử từ Android Studio hoặc sử dụng dòng lệnh Gradle, thì các tệp theo dõi sẽ tự động được sao chép từ thiết bị sang máy chủ lưu trữ. Những nội dung 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 File > Open (Tệp > Mở) trong trình đơn. Sau đó, khung hiển thị công cụ phân tích tài nguyên đã thấy ở phần trước sẽ hiện lên.

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 xảy 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.

Tuỳ 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 tuỳ 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 tuỳ chỉnh

Bạn có thể đo lường ứng dụng của mình bằng sự kiện theo dõi tuỳ chỉnh. Sự kiện này 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 vấn đề cụ thể đối với ứng dụng. Để tìm hiểu thêm về cách tạo sự kiện theo dõi tuỳ chỉnh, hãy xem hướng dẫn Xác định sự kiện tuỳ chỉnh.

CompilationMode

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

Theo mặc định, điểm chuẩn vĩ mô đượ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ẽ biên dịch toàn bộ APK dưới dạng hành vi 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ể tuỳ chỉnh CompilationMode để ảnh hưởng đến số lượng quá trình biên dịch trước trên thiết bị nhằm bắt chước nhiều cấp độ của quá trình biên dịch AOT (Trước) hoặc lưu vào bộ nhớ đệm JIT (Đúng lúc). 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 xoá 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.

StartupMode

Để 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 kiểm thử.

Để 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ữ android/performance-samples 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 công cụ theo dõi lỗi công khai.