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 của bạn, bao gồm cả việc khởi động ứng dụng và các thao tác phức tạp trên giao diện người dùng, 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. Trang này cho biết cách thiết lập thư viện Macrobenchmark.

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 tính năng tích hợp liên tục (CI) như mô tả trong bài viết Điểm chuẩn trong tính năng Tích hợp liên tục.

Bạn có thể sử dụng Macrobenchmark để tạo Hồ sơ cơ sở. Trước tiên, hãy thiết lập thư viện Macrobenchmark, sau đó bạn có thể tạo Hồ sơ 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 để có các tính năng của IDE tích hợp với Macrobenchmark.

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

Macrobenchmark 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 hoạt động 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 chọn New > Module (Mới > Mô-đun).

  2. Chọn Benchmark (Điểm chuẩn) trong ngăn Templates (Mẫu). Bạn có thể tuỳ chỉnh ứng dụng mục tiêu (nghĩa là ứng dụng được đo điểm chuẩn), cũng như tên gói và tên mô-đun cho mô-đun Macrobenchmark mới.

  3. Nhấp vào Finish (Hoàn tất).

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

Hình 1. 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 Macrobenchmark), ứng dụng đó phải profileable (cho phép đọc thông tin chi tiết về dấu vế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.

Hãy đảm bảo ứng dụng mục tiêu có ProfilerInstaller 1.3 trở lên. Thư viện Macrobenchmark cần bật tính năng chụp và đặt lại hồ sơ, xoá bộ nhớ đệm của chương trình đổ bóng.

Định cấu hình ứng dụng được đ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:

Kotlin

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

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

Groovy

buildTypes {
    val release = getByName("release") {
        isMinifyEnabled = true
        isShrinkResources = true
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
        // In real app, this would use its own release keystore
        signingConfig = signingConfigs.getByName("debug")
    }

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

Để đảm bảo quá trình chạy phép đo điểm chuẩn vừa tạo bản dựng vừa kiểm thử đúng biến thể ứng dụng, như trong hình 2, hãy làm như sau:

  1. Đồng bộ hoá Gradle.
  2. Mở bảng điều khiển Build Variants (Biến thể bản dựng).
  3. Chọn biến thể điểm chuẩn của cả ứng dụng và mô-đun Macrobenchmark.

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

Hình 2. 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, hãy đả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. 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.

Kotlin

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

    matchingFallbacks += listOf("release")
}

Groovy

benchmark {
    initWith buildTypes.release
    signingConfig signingConfigs.debug

    matchingFallbacks = ['release']
}

Nếu không thực hiện điều này, loại bản dựng benchmark mới thêm vào sẽ khiến bản dựng này không hoạt động và hiện thông báo lỗi sau:

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

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ư trong hình 3:

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

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

Để biết thêm thông tin, hãy xem bài viết Sử dụng tính năng 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 bạn đã đặt nhiều phiên bản sản phẩm trong ứng dụng, hãy đị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.

Ví dụ trên trang này sử dụng 2 phiên bản sản phẩm trong mô-đun :app: demoproduction, như minh hoạ trong đoạn mã sau đây:

Kotlin

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

Groovy

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

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

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:
           ...

Hai phần sau đây trình bày cách định cấu hình đo điểm chuẩn khi có nhiều phiên bản sản phẩm.

Sử dụng missingDimensionStrategy

Việc chỉ định missingDimensionStrategy trong defaultConfig của 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. Hãy chỉ định sử dụng nhóm phiên bản nào nếu bạn không tìm thấy nhóm phiên bản trong mô-đun. Trong ví dụ sau, phiên bản production được dùng làm nhóm mặc định:

Kotlin

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

Groovy

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, hãy 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:

Kotlin

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

Groovy

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

    production {
        dimension 'environment'
    }
}

Sau khi xác định và đồng bộ hoá dự án, hãy chọn biến thể bản dựng phù hợp trong ngăn Build Variants (Biến thể bản dựng) như trong hình 4:

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

Hình 4. Biến thể điểm chuẩn cho dự án có các phiên bản sản phẩm cho thấy đã chọn "productBenchmark" và "release".

Để biết thêm thông tin, hãy 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ối thiểu, bạn cần chỉ định packageName của ứng dụng mục tiêu, metrics nào bạn muốn đo lường và lượng iterations mà điểm chuẩn phải 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 = 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.

Chạy điểm chuẩn

Chạy hoạt động 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ể sử dụng thao tác trong rãnh kế bên lớp hoặc phương thức kiểm thử để chạy điểm chuẩn tương tự như cách bạn chạy các @Test khác, như trong hình 5.

Dùng thao tác trong rãnh kế bên lớp kiểm thử để chạy macrobenchmark

Hình 5. Dùng thao tác trong rãnh kế bên lớp kiểm thử để chạy Macrobenchmark.

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

Bạn có thể chạy một quy trình kiểm thử duy nhất bằng cách thực thi lệnh sau đây:

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

Xem bài viết Điểm chuẩn trong tính năng Tích hợp liên tục để biết thông tin về cách chạy và theo dõi điểm chuẩn trong tính năng 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ố sẽ hiển thị trực tiếp trong Android Studio và 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 kết quả theo dõi này bằng cách nhấp vào các đường liên kết trong ngăn Kết quả kiểm thử, như trong hình 6:

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

Hình 6. 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. Hệ thống sẽ điền sẵn quy trình của ứng dụng mục tiêu, như trong hình 7:

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

Hình 7. Lựa chọn quy trình theo dõi trong 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 trong Studio

Hình 8. Dấu vết trong 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 vị trí sau:

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ần thực hiện thêm vài bước. Với Perfetto, bạn có thể 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 vị trí sau:

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

Khi đã có tệp theo dõi trong hệ thống lưu trữ, bạn có thể mở tệp đó trong Android Studio bằng cách chọn 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.

Macrobenchmark cũng trả về lỗi khi cố gắng đo lường một trình mô phỏng hoặc trên thiết bị yếu pin, đ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 khởi động 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ó những chỉ số sau:

Để biết thêm thông tin về các chỉ số, hãy xem bài viết Ghi lại chỉ số Macrobenchmark.

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 bài viết Xác định sự kiện tuỳ chỉnh.

CompilationMode

Macrobenchmark có thể chỉ định một CompilationMode. 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, Macrobenchmark đượ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.Partial, CompilationMode.NoneCompilationMode.Ignore.

Tính 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 không xảy ra tình trạng cản trở 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: COLD, WARM hoặc HOT của chúng tôi. 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 Thời gian khởi động ứng dụng.

Mẫu

Một dự án mẫu có sẵn trong Mẫu Macrobenchmark của kho lưu trữ trên GitHub.

Gửi ý kiến 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.