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:
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).
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.
Nhấp vào Hoàn tất.
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.
Đảm bảo rằng ứng dụng đích bao gồm
ProfilerInstaller
1.3 hoặc
mà thư viện Macrobenchmark cần để bật tính năng chụp ảnh hồ sơ và
đặt lại và 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 { 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") } }
Để đả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:
- Đồng bộ hoá Gradle.
- Mở bảng điều khiển Build Variants (Biến thể bản dựng).
- Chọn biến thể điểm chuẩn của cả ứng dụng và mô-đun Macrobenchmark.
(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
và :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
và :macrobenchmark
, còn release
cho mọi mô-đun khác mà bạn có trong ứng dụng, như trong hình 3:
Để 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
: demo
và production
, 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ế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.
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:
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:
Sau khi tệp theo dõi được tải, Studio sẽ hiển thị kết quả trong Trình phân tích CPU công cụ:
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 bạn muốn sử dụng Perfetto để phân tích tệp theo dõi, có thêm các bước bổ sung liên quan. 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.None
vàCompilationMode.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.
Đề xuất cho bạn
- Lưu ý: văn bản có đường liên kết sẽ hiện khi JavaScript tắt
- Ghi lại chỉ số Macrobenchmark
- Tạo Hồ sơ cơ sở {:#creating-profile-rules}
- Tự động đo lường với thư viện Macrobenchmark {:#measuring-optimization}