Là một nhà phát triển ứng dụng, bạn có thể tự động tạo hồ sơ cho mọi bản phát hành ứng dụng bằng thư viện Jetpack Macrobenchmark và BaselineProfileRule
. Bạn nên sử dụng com.android.tools.build:gradle:8.0.0
trở lên, cùng với các cải tiến về bản dựng khi sử dụng Hồ sơ cơ sở.
Xác định trình tạo Hồ sơ cơ sở
Để tạo Hồ sơ cơ sở bằng thư viện Macrobenchmark, hãy thực hiện các bước sau:
Thiết lập mô-đun Macrobenchmark trong dự án Gradle của bạn.
Xác định chương trình kiểm thử mới có tên là
BaselineProfileGenerator
:class BaselineProfileGenerator { @get:Rule val baselineProfileRule = BaselineProfileRule() @Test fun startup() = baselineProfileRule.collectBaselineProfile( packageName = "com.example.app", profileBlock = { startActivityAndWait() } ) }
Trình tạo có thể chứa các hoạt động tương tác với ứng dụng của bạn ngoài việc khởi động ứng dụng. Nhờ đó, bạn có thể tối ưu hoá hiệu suất trong thời gian chạy của ứng dụng, chẳng hạn như việc cuộn danh sách, chạy ảnh động và di chuyển trong
Activity
. Hãy xem những ví dụ khác về các chương trình kiểm thử sử dụng@BaselineProfileRule
để cải thiện các hành trình trọng yếu của người dùng.(Không bắt buộc) Tắt tính năng làm rối mã nguồn khi tạo Hồ sơ cơ sở. Để làm việc này, bạn có thể tạo một tệp ProGuard khác trong mô-đun ứng dụng và chỉ thêm
-dontobfuscate
cho loại bản dựngbenchmark
chịu trách nhiệm tạo hồ sơ.
Kotlin
buildTypes { val benchmark by creating { // Only use benchmark Proguard rules. proguardFiles("benchmark-rules.pro") // ... } }
Groovy
buildTypes { benchmark { // Only use benchmark Proguard rules. proguardFiles 'benchmark-rules.pro' // ... } }
Tạo Hồ sơ cơ sở
Chạy trình tạo ở dạng kiểm thử đo lường trên thiết bị thực, trình mô phỏng hoặc thiết bị do Gradle quản lý đã bị can thiệp vào hệ thống. Để thiết lập một thiết bị được quản lý, hãy mở tệp build.gradle.kts
. Trong khối cấu hình testOptions
, hãy thêm managedDevices
và devices
rồi tạo một định nghĩa trình mô phỏng. Sử dụng aosp
làm systemImageSource
vì bạn cần có quyền truy cập vào thư mục gốc cho trình tạo Hồ sơ cơ sở.
Kotlin
testOptions { managedDevices { devices { create ("pixel6Api31", ManagedVirtualDevice::class) { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } } }
Groovy
testOptions { managedDevices { devices { pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } } }
Gradle sẽ tạo các tác vụ bắt buộc dựa trên tên thiết bị đã chọn và những biến thể bản dựng có sẵn trong mô-đun. Tệp này có định dạng là [emulator_name][flavor][build type]AndroidTest
. Bạn có thể thực hiện thao tác này trên một thiết bị đầu cuối:
./gradlew :benchmark:pixel6Api31BenchmarkAndroidTest
Ghi lại mọi đường dẫn mã bắt buộc
Hai chỉ số chính giúp đo lường thời gian khởi động ứng dụng là thời gian hiển thị khung hình đầu tiên (TTID) và thời gian hiển thị khung hình đầu tiên với nội dung đầy đủ (TTFD). TTID là thời gian cần thiết để hiển thị khung hình đầu tiên trên giao diện người dùng của ứng dụng. TTFD cũng bao gồm thời gian để hiển thị nội dung tải không đồng bộ sau khi khung hình đầu tiên được hiển thị.
TTFD được báo cáo sau khi phương thức reportFullyDrawn()
của ComponentActivity
được gọi. Nếu reportFullyDrawn()
không được gọi, thì TTID sẽ được báo cáo.
Bạn có thể cần phải trì hoãn thời điểm reportFullyDrawn()
được gọi cho đến khi quá trình tải không đồng bộ hoàn tất. Ví dụ: nếu giao diện người dùng chứa một danh sách động, chẳng hạn như danh sách RecyclerView
hoặc danh sách lazy, thì có thể danh sách này sẽ được điền bằng một tác vụ trong nền (hoàn tất sau khi danh sách này hiển thị lần đầu và do đó, chính là thời điểm sau khi giao diện người dùng được đánh dấu là đã hiển thị đầy đủ). Trong những trường hợp như vậy, mã chạy sau khi giao diện người dùng đạt đến trạng thái hiển thị đầy đủ sẽ không được đưa vào Hồ sơ cơ sở.
Để đưa hoạt động điền danh sách vào Hồ sơ cơ sở, hãy lấy FullyDrawnReporter
bằng cách sử dụng getFullyDrawnReporter()
và thêm một trình báo cáo vào đó trong mã ứng dụng của bạn. Giải phóng trình báo cáo khi tác vụ trong nền hoàn tất hoạt động điền danh sách. FullyDrawnReporter
không gọi phương thức reportFullyDrawn()
cho đến khi mọi trình báo cáo được giải phóng. Bằng cách này, Hồ sơ cơ sở sẽ bao gồm các đường dẫn mã cần thiết để điền danh sách. Điều này không làm thay đổi hành vi của ứng dụng đối với người dùng nhưng cho phép Hồ sơ cơ sở bao gồm mọi đường dẫn mã cần thiết.
Nếu ứng dụng của bạn dùng Jetpack Compose, hãy sử dụng các API sau để biểu thị trạng thái hiển thị đầy đủ:
ReportDrawn
cho biết thành phần kết hợp của bạn đã sẵn sàng tương tác ngay lập tức.ReportDrawnWhen
sử dụng một thuộc tính, chẳng hạn nhưlist.count > 0
, để cho biết thời điểm thành phần kết hợp của bạn đã sẵn sàng tương tác.ReportDrawnAfter
sử dụng phương thức tạm ngưng mà khi phương thức này hoàn tất, sẽ cho biết thành phần kết hợp của bạn đã sẵn sàng tương tác.
Trình bổ trợ Gradle cho Hồ sơ cơ sở
Trình bổ trợ Gradle cho Hồ sơ cơ sở giúp bạn dễ dàng tạo và duy trì Hồ sơ cơ sở. Công cụ này thực hiện các bước cần thiết để tạo và cài đặt Hồ sơ cơ sở vào mô-đun ứng dụng của bạn.
Để sử dụng trình bổ trợ này, hãy thêm một mô-đun kiểm thử đo lường vào dự án của bạn và xác định một tập hợp các bài kiểm thử điều hướng qua ứng dụng để mô phỏng các hành trình trọng yếu của người dùng. Khi bạn chạy các bài kiểm thử đo lường, trình bổ trợ Grandle cho Hồ sơ cơ sở sẽ theo dõi mọi lớp và phương thức được thực thi trong các hành trình của người dùng, đồng thời tạo một hồ sơ cơ sở dựa trên các lớp và phương thức này. Sau đó, trình bổ trợ sẽ sao chép hồ sơ cơ sở đã tạo vào mô-đun ứng dụng.
Mô-đun kiểm thử đo lường là trình tạo hồ sơ. Mô-đun ứng dụng là đối tượng sử dụng hồ sơ.
Các quy trình chính mà bạn cần tập trung là quy trình thiết lập ban đầu và tạo chương trình kiểm thử để mô phỏng các hành trình trọng yếu của người dùng.
Những gì bạn cần để sử dụng trình bổ trợ
- AGP 8.0.0 trở lên
- Phần phụ thuộc trên phiên bản trình bổ trợ Gradle mới nhất (alpha13 trở lên)
Sử dụng trình bổ trợ
Ví dụ sau giả định rằng tồn tại một mô-đun ứng dụng tên là :app
.
Có 2 mô-đun trong ví dụ sau:
- Đối tượng sử dụng hồ sơ: mô-đun ứng dụng cần được tạo hồ sơ. Trong ví dụ sau, đó là
:app
. - Trình tạo hồ sơ: mô-đun kiểm thử Hồ sơ cơ sở có chứa các bài kiểm thử đo lường để tạo hồ sơ. Trong ví dụ sau, mô-đun này có tên là
:baseline-profile
.
Để sử dụng trình bổ trợ này, hãy thực hiện các bước sau:
- Tạo một mô-đun
com.android.test
mới – ví dụ::baseline-profile
. - Định cấu hình
build.gradle
cho:baseline-profile
: - Áp dụng trình bổ trợ
androidx.baselineprofile
. - Đảm bảo
targetProjectPath
trỏ đến mô-đun:app
. - Thêm GMD (không bắt buộc). Trong ví dụ sau, đó là
pixel6Api31
. Nếu không được chỉ định, trình bổ trợ sẽ sử dụng một thiết bị được kết nối, đó là thiết bị mô phỏng hoặc thiết bị thực. - Áp dụng cấu hình bạn muốn, như trong ví dụ sau.
- Tạo một bài kiểm thử Hồ sơ cơ sở trong mô-đun kiểm thử
:baseline-profile
. Sau đây là ví dụ về một bài kiểm thử khởi động ứng dụng và chờ cho ứng dụng ở trạng thái rảnh. - Cập nhật cấu hình trong
build.gradle
của mô-đun ứng dụng:app
. - Áp dụng trình bổ trợ
androidx.baselineprofile
. - Thêm phần phụ thuộc
baselineProfile
vào mô-đun:baseline-profile
. - Tạo hồ sơ bằng cách chạy mã sau:
./gradlew :app:generateBaselineProfile
.
Kotlin
plugins { id("com.android.test") id("androidx.baselineprofile") } android { // There are no changes here. It's documented for completeness. defaultConfig { ... } // This must point to the app module. targetProjectPath = ":app" // This is the optional managed device. testOptions.managedDevices.devices { pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } } // There are no changes here. It's documented for completeness. dependencies { ... } // This is the plugin configuration. Everything is optional. Defaults are in the // comments. In this example, you use the GMD added earlier and disable // connected devices. baselineProfile { // This specifies the managed devices to use that you run the tests on. The // default is none. managedDevices += "pixel6Api31" // This enables using connected devices to generate profiles. The default is // true. When using connected devices, they must be rooted or API 33 and // higher. useConnectedDevices = false }
Groovy
plugins { id 'com.android.test' id 'androidx.baselineprofile' } android { // There are no changes here. It's documented for completeness. defaultConfig { ... } // This must point to the app module. targetProjectPath ':app' // This is the optional managed device. testOptions.managedDevices.devices { pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) { device 'Pixel 6' apiLevel 31 systemImageSource 'aosp' } } } // There are no changes here. It's documented for completeness. dependencies { ... } // This is the plugin configuration. Everything is optional. Defaults are in the // comments. In this example, you use the GMD added earlier and disable // connected devices. baselineProfile { // This specifies the managed devices to use that you run the tests on. The // default is none. managedDevices ['pixel6Api31'] // This enables using connected devices to generate profiles. The default is // true. When using connected devices, they must be rooted or API 33 and // higher. useConnectedDevices false }
Kotlin
class BaselineProfileGenerator { @get:Rule val baselineRule = BaselineProfileRule() @Test fun startupBaselineProfile() { baselineRule.collectBaselineProfile("com.myapp") { startActivityAndWait() } } }
Java
public class BaselineProfileGenerator { @Rule Public BaselineProfileRule baselineRule = new BaselineProfileRule(); @Test Public void startupBaselineProfile() { baselineRule.collectBaselineProfile( "com.myapp", (scope -> { scope.startActivityAndWait(); Return Unit.INSTANCE; }) } } }
Kotlin
plugins { id("com.android.application") id("androidx.baselineprofile") } android { // There are no changes to the `android` block. ... } dependencies { ... // Add a baselineProfile dependency to the :baseline-profile module. baselineProfile(project(":baseline-profile")) }
Groovy
plugins { id 'com.android.application' id 'androidx.baselineprofile' } android { // No changes to the `android` block. ... } dependencies { ... // Add a baselineProfile dependency to the :baseline-profile module. baselineProfile ':baseline-profile"' }
Khi bạn kết thúc nhiệm vụ tạo, Hồ sơ cơ sở sẽ được lưu trữ trong app/src/release/generated/baselineProfiles
.
Tạo Hồ sơ cơ sở cho thư viện
Trong ví dụ sau, mô-đun thư viện tên là :library
và mô-đun ứng dụng tên là :sample-app
, có chứa một ứng dụng dùng thư viện.
Trong ví dụ này, bạn cần 3 mô-đun:
- Đích chứa ứng dụng: một mô-đun ứng dụng có chứa ứng dụng mẫu. Trong ví dụ sau, đó là
:sample-app
. - Đối tượng sử dụng hồ sơ: mô-đun thư viện cần được tạo hồ sơ. Trong ví dụ sau, đó là
:library
. - Trình tạo hồ sơ: mô-đun kiểm thử Hồ sơ cơ sở có chứa các bài kiểm thử đo lường để tạo mô-đun.
Để tạo Hồ sơ cơ sở cho thư viện, hãy thực hiện các bước sau:
- Tạo một mô-đun
com.android.test
mới – ví dụ::baseline-profile
. - Định cấu hình
build.gradle
cho:baseline-profile
: - Áp dụng trình bổ trợ
androidx.baselineprofile
. - Đảm bảo
targetProjectPath
trỏ đến mô-đun:sample-app
. - Thêm GMD (không bắt buộc). Trong ví dụ sau, đó là
pixel6Api31
. - Áp dụng cấu hình bạn muốn, như trong ví dụ sau.
- Tạo một bài kiểm thử Hồ sơ cơ sở trong mô-đun kiểm thử
:baseline-profile
. Đây phải là bài kiểm thử dành riêng cho ứng dụng mẫu và phải sử dụng mọi chức năng của thư viện. - Cập nhật cấu hình trong
build.gradle
của mô-đun thư viện:library
. - Áp dụng trình bổ trợ
androidx.baselineprofile
. - Thêm phần phụ thuộc
baselineProfile
vào mô-đun:baseline-profile
. - Áp dụng cấu hình trình bổ trợ đối tượng sử dụng mà bạn muốn, như trong ví dụ sau.
- Cập nhật cấu hình trong
build.gradle
của mô-đun ứng dụng:sample-app
, thêm trình bổ trợandroidx.baselineprofile
. - Tạo hồ sơ bằng cách chạy mã sau:
./gradlew :library:generateBaselineProfile
.
Kotlin
plugins { id("com.android.test") id("androidx.baselineprofile") } android { // There are no changes here. It's reported for completeness. defaultConfig { minSdkVersion 23 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } // This must point to the app module. targetProjectPath = ":app" // This is the optional managed device. testOptions.managedDevices.devices { create("pixel6Api31") { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } } // There's nothing to change here. dependencies { ... } // This is the plugin configuration. Everything is optional. Defaults are in the // comments. In this example, you use the GMD added earlier and disable // connected devices. baselineProfile { // This specifies the managed devices to use that you run the tests on. The // default is none. managedDevices += "pixel6Api31" // This enables using connected devices to generate profiles. The default is // true. When using connected devices, they must be rooted or API 33 and // higher. useConnectedDevices = false }
Groovy
plugins { id 'com.android.test' id 'androidx.baselineprofile' } android { // There are no changes here. It's reported for completeness. defaultConfig { ... } // This must point to the app module. targetProjectPath ':app' // This is the optional managed device. testOptions.managedDevices.devices { pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) { device 'Pixel 6' apiLevel 31 systemImageSource 'aosp' } } } // There's nothing to change here. dependencies { ... } // This is the plugin configuration. Everything is optional. Defaults are in the // comments. In this example, you use the GMD added earlier and disable // connected devices. baselineProfile { // This specifies the managed devices to use that you run the tests on. The // default is none. managedDevices ['pixel6Api31'] // This enables using connected devices to generate profiles. The default is // true. When using connected devices, they must be rooted or API 33 and // higher. useConnectedDevices false }
Kotlin
plugins { id("com.android.library") id("androidx.baselineprofile") } // There are no changes to the android block. android { ... } dependencies { ... // Add a baselineProfile dependency to the :baseline-profile module. baselineProfile(project(":baseline-profile")) } // This is the plugin configuration. baselineProfile { // This filters the generated profile rules. In this example, you keep // all the classes in com.library and in all the subpackages. filter { include "com.mylibrary.**" } }
Groovy
plugins { id 'com.android.library' id 'androidx.baselineprofile' } // There are no changes to the android block. android { ... } dependencies { ... // Add a baselineProfile dependency to the :baseline-profile module. baselineProfile ':baseline-profile' } // This is the plugin configuration. baselineProfile { // This filters the generated profile rules. In this example, you keep // all the classes in com.library and in all the subpackages. filter { include 'com.mylibrary.**' } }
Kotlin
plugins { ... id("androidx.baselineprofile") } // There are no other changes to the configuration.
Groovy
plugins { ... id 'androidx.baselineprofile' } // There are no other changes to the configuration.
Khi bạn kết thúc nhiệm vụ tạo, Hồ sơ cơ sở sẽ được lưu trữ trong library/src/main/generated/baselineProfiles
.
DSL
Mặc dù tài liệu này đề cập đến trình bổ trợ Gradle cho Hồ sơ cơ sở dưới dạng một trình bổ trợ duy nhất, nhưng trên thực tế, có 3 trình bổ trợ thực hiện các nhiệm vụ khác nhau, tuỳ theo mô-đun được áp dụng. Mã trình bổ trợ trong tài liệu này là androidx.baselineprofile
. Đây lối tắt dẫn đến 3 trình bổ trợ.
Để hiểu rõ hơn về khái niệm này, hãy xem các mô-đun mà bạn cần dưới đây để tạo Hồ sơ cơ sở:
- Một ứng dụng để chạy các bài kiểm thử Hồ sơ cơ sở. Đây là mô-đun ứng dụng Android có
com.android.application
được áp dụng. Khi bạn tạo hồ sơ cho một thư viện, đây có thể là một ứng dụng mẫu. Khi bạn tạo hồ sơ cho một ứng dụng, đây sẽ chính là ứng dụng đó. Trong ví dụ sau, trình bổ trợandroidx.baselineprofile
áp dụng nội bộandroidx.baselineprofile.apptarget
. - Một mô-đun kiểm thử Hồ sơ cơ sở có chứa các bài kiểm thử cần chạy. Đây là mô-đun kiểm thử Android có
com.android.test
được áp dụng. Trong ví dụ sau, trình bổ trợandroidx.baselineprofile
áp dụng nội bộandroidx.baselineprofile.producer
. - Một mô-đun mà sau cùng sẽ sử dụng Hồ sơ cơ sở trong quy trình xây dựng. Đây là mô-đun
com.android.application
của ứng dụng Android hoặc mô-đuncom.android.library
của thư viện. Trong ví dụ sau, trình bổ trợandroidx.baselineprofile
áp dụng nội bộandroidx.baselineprofile.consumer
.
Đích chứa ứng dụng (androidx.baselineprofile.apptarget)
Đích này không có bất kỳ cấu hình nào.
Trình tạo hồ sơ (androidx.baselineprofile.producer)
Hỗ trợ các thiết bị do Gradle quản lý
Để sử dụng thiết bị do Gradle quản lý (GMD), hãy thêm thiết bị vào cấu hình build.gradle
của mô-đun trình tạo hồ sơ, như trong ví dụ sau:
Kotlin
android { testOptions.managedDevices.devices { create("pixel6Api31") { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } }
Groovy
android { testOptions.managedDevices.devices { pixel6Api31(ManagedVirtualDevice) { device 'Pixel 6' apiLevel = 31 systemImageSource 'aosp' } } }
Sau đó, bạn có thể sử dụng GMD đã tạo để tạo Hồ sơ cơ sở bằng cách thêm GMD vào như sau:
Kotlin
baselineProfile { managedDevices += "pixel6Api31" }
Groovy
baselineProfile { managedDevices = ['pixel6Api31'] }
Ví dụ sau đây cho biết các tuỳ chọn bổ sung hiện có để bật hoặc tắt các thiết bị đã kết nối nhằm giúp tạo Hồ sơ cơ sở.
Kotlin
baselineProfile { ... useConnectedDevices = true }
Groovy
baselineProfile { ... useConnectedDevices true }
Đối tượng sử dụng hồ sơ (androidx.baselineprofile.consumer)
Tạo hồ sơ cho mỗi phiên bản và một hồ sơ cho tất cả các biến thể
Bạn có thể tạo hồ sơ cho mỗi biến thể, mỗi phiên bản hoặc tạo hồ sơ dưới dạng một tệp duy nhất để sử dụng cho mọi biến thể. Bạn có thể kiểm soát hành vi này thông qua chế độ cài đặt hợp nhất, như trong ví dụ sau.
Kotlin
baselineProfile { mergeIntoMain = true / false }
Groovy
baselineProfile { mergeIntoMain true / false }
- Đặt
mergeIntoMain
thànhtrue
để hợp nhất mọi hồ sơ đã tạo cho mỗi biến thể thành một hồ sơ duy nhất. Bạn không thể tạo Hồ sơ cơ sở cho mỗi biến thể khi chế độ cài đặt này làtrue
. Như vậy, sẽ chỉ có một tác vụ tạo duy nhất có tên làgenerateBaselineProfile
tồn tại. Dữ liệu đầu ra của hồ sơ làsrc/main/generated/baselineProfiles
. - Đặt
mergeIntoMain
thànhfalse
để tắt tính năng hợp nhất và sẽ có một hồ sơ cho mỗi biến thể. Bạn có thể tạo Hồ sơ cơ sở theo biến thể như trong ví dụ sau để có nhiều tác vụ tạo cùng tồn tại — một tác vụ cho mỗi biến thể. Ví dụ: khi có 2 phiên bản (chẳng hạn như miễn phí và trả phí) và một loại bản phát hành, các tác vụ được tạo như sau:generateFreeReleaseBaselineProfile
generatePaidReleaseBaselineProfile
generateReleaseBaselineProfile
Theo mặc định, chế độ cài đặt này là true
đối với thư viện và false
đối với ứng dụng.
Bạn cũng có thể chỉ định hành vi này cho mỗi biến thể:
Kotlin
baselineProfile { variants { freeRelease { mergeIntoMain = true / false } } }
Groovy
baselineProfile { variants { freeRelease { mergeIntoMain true / false } } }
Trong ví dụ trước, các biến thể trong đó cờ được đặt thành true
đều được hợp nhất vào src/main/generated/baselineProfiles
, trong khi hồ sơ của các biến thể trong đó cờ được đặt là false sẽ được lưu giữ trong thư mục src/<variant>/generated/baselineProfiles
.
Tự động tạo Hồ sơ cơ sở khi tập hợp một bản phát hành mới
Bạn có thể kích hoạt việc tạo Hồ sơ cơ sở theo cách thủ công thông qua tác vụ generateBaselineProfile
hoặc theo cách tự động khi tạo bản phát hành. Bạn có thể kiểm soát hành vi này bằng cờ sau:
Kotlin
baselineProfile { automaticallyGenerateDuringBuild = true / false }
Groovy
baselineProfile { automaticallyGenerateDuringBuild true / false }
Việc đặt cờ này thành true
sẽ kích hoạt một Hồ sơ cơ sở mới được tạo cho mỗi tập hợp. Bằng cách này, hồ sơ mới nhất sẽ được đưa vào bản dựng. Điều này có nghĩa là việc chạy tác vụ bản phát hành tập hợp (chẳng hạn như ./gradlew:app:assembleRelease
) cũng sẽ kích hoạt :app:generateReleaseBaselineProfile
. Thao tác này cũng khởi động các bài kiểm thử đo lường trong Hồ sơ cơ sở và tạo bản dựng Hồ sơ cơ sở để chạy bài kiểm thử.
Tuy điều này giúp đảm bảo rằng người dùng có được hiệu suất tốt nhất, nhưng thời gian xây dựng cũng tăng lên do phải xây dựng cả bài kiểm thử đo lường và bản dựng.
Bạn cũng có thể chỉ định hành vi này cho mỗi biến thể, như trong ví dụ sau:
Kotlin
baselineProfile { variants { freeRelease { automaticallyGenerateDuringBuild = true / false } } }
Groovy
baselineProfile { variants { freeRelease { automaticallyGenerateDuringBuild true / false } } }
Trong ví dụ trước, tác vụ generateFreeReleaseBaselineProfile
sẽ chạy khi khởi động assembleFreeRelease
. Điều này sẽ giúp ích khi người dùng muốn có, chẳng hạn như một release
cho bản dựng phân phối (luôn tạo hồ sơ khi tạo bản dựng) và một bản dựng releaseWithoutProfile
để kiểm thử nội bộ.
Lưu trữ Hồ sơ cơ sở vào nguồn
Bạn có thể lưu trữ Hồ sơ cơ sở trong thư mục nguồn bằng cờ saveInSrc
:
true
: Hồ sơ cơ sở được lưu trữ trongsrc/<variant>/generated/baselineProfiles
. Khi đó, bạn có thể bạn xác nhận hồ sơ mới nhất được tạo bằng các nguồn của mình.false
: Hồ sơ cơ sở được lưu trữ trong các tệp trung gian trong thư mục bản dựng. Theo đó, khi thực hiện mã, bạn sẽ không lưu hồ sơ mới nhất được tạo.
Kotlin
baselineProfile { saveInSrc = true / false }
Groovy
baselineProfile { saveInSrc true / false }
Bạn cũng có thể chỉ định hành vi này cho mỗi biến thể:
Kotlin
baselineProfile { variants { freeRelease { saveInSrc = true / false } } }
Groovy
baselineProfile { variants { freeRelease { saveInSrc true / false } } }
Lọc quy tắc hồ sơ
Bạn có thể lọc các quy tắc của Hồ sơ cơ sở được tạo thông qua cấu hình trình bổ trợ. Thao tác này đặc biệt giúp ích cho các thư viện nếu bạn muốn loại trừ quy tắc hồ sơ cho các lớp và phương thức trong những phần phụ thuộc khác của ứng dụng mẫu hoặc chính thư viện đó. Có thể sử dụng bộ lọc cho các gói và lớp để chỉ định, bao gồm và loại trừ. Khi bạn chỉ định các trường hợp loại trừ, thì chỉ các quy tắc Hồ sơ cơ sở phù hợp mới bị loại trừ và mọi nội dung khác sẽ được bao gồm.
Thông số kỹ thuật của bộ lọc có thể thuộc bất kỳ loại nào sau đây:
- Tên gói kết thúc bằng ký tự đại diện kép để khớp với gói được chỉ định và mọi gói con. Ví dụ:
com.example.**
khớp vớicom.example.foo
vàcom.example.foo.bar
. - Tên gói kết thúc bằng ký tự đại diện để chỉ khớp với gói đã chỉ định. Ví dụ:
com.example.*
khớp vớicom.example.foo
nhưng không khớp vớicom.example.foo.bar
. - Tên lớp để khớp với một lớp cụ thể – ví dụ:
com.example.MyClass
.
Các ví dụ sau đây minh hoạ cách bao gồm và loại trừ các gói cụ thể:
Kotlin
baselineProfile { filter { include("com.somelibrary.widget.grid.**") exclude("com.somelibrary.widget.grid.debug.**") include("com.somelibrary.widget.list.**") exclude("com.somelibrary.widget.list.debug.**") include("com.somelibrary.widget.text.**") exclude("com.somelibrary.widget.text.debug.**") } }
Groovy
baselineProfile { filter { include 'com.somelibrary.widget.grid.**' exclude 'com.somelibrary.widget.grid.debug.**' include 'com.somelibrary.widget.list.**' exclude 'com.somelibrary.widget.list.debug.**' include 'com.somelibrary.widget.text.**' exclude 'com.somelibrary.widget.text.debug.**' } }
Bộ lọc cũng hỗ trợ các biến thể và bạn có thể biểu thị chúng như sau:
Kotlin
// Non-specific filters applied to all the variants. baselineProfile { filter { include("com.myapp.**") } } // Flavor-specific filters. baselineProfile { variants { free { filter { include("com.myapp.free.**") } } paid { filter { include("com.myapp.paid.**") } } } } // Build-type-specific filters. baselineProfile { variants { release { filter { include("com.myapp.**") } } } } // Variant-specific filters. baselineProfile { variants { freeRelease { filter { include("com.myapp.**") } } } }
Groovy
// Non-specific filters applied to all the variants. baselineProfile { filter { include 'com.myapp.**' } } // Flavor-specific filters. baselineProfile { variants { free { filter { include 'com.myapp.free.**' } } paid { filter { include 'com.myapp.paid.**' } } } } // Build-type specific filters. baselineProfile { variants { release { filter { include 'com.myapp.**' } } } } // Variant-specific filters. baselineProfile { variants { freeRelease { filter { include 'com.myapp.**' } } } }
Áp dụng các quy tắc đã tạo theo cách thủ công
Trình tạo Hồ sơ cơ sở sẽ tạo một tệp văn bản có Định dạng mà con người có thể đọc được (HRF) trên thiết bị rồi sao chép tệp đó vào máy chủ. Để áp dụng hồ sơ đã tạo cho mã của bạn, hãy làm theo các bước sau:
Tìm tệp HRF trong thư mục bản dựng của mô-đun mà bạn tạo hồ sơ:
[module]/build/outputs/managed_device_android_test_additional_output/[device]
.Các hồ sơ tuân theo mẫu đặt tên
[class name]-[test method name]-baseline-prof.txt
, có dạng như sau:BaselineProfileGenerator-startup-baseline-prof.txt
.Sao chép hồ sơ đã tạo vào
src/flavor/baselineProfiles
trong mô-đun ứng dụng của bạn để tạo phiên bản bất kỳ. Để áp dụng hồ sơ cho tất cả các phiên bản, hãy sao chép hồ sơ đó vàosrc/main/baselineProfiles
.Thêm phần phụ thuộc vào thư viện ProfileInstaller trong tệp
build.gradle.kts
của ứng dụng để bật tính năng biên dịch Hồ sơ cơ sở cục bộ khi chưa có Hồ sơ trên đám mây. Đây là cách duy nhất để cài đặt một Hồ sơ cơ sở ở phạm vi cục bộ mà không qua cửa hàng ứng dụng.dependencies { implementation("androidx.profileinstaller:profileinstaller:1.3.1") }
Xây dựng phiên bản phát hành chính thức của ứng dụng, trong khi các quy tắc HRF áp dụng được biên dịch thành dạng nhị phân và đưa vào APK hoặc AAB. Sau đó, phân phối ứng dụng như bình thường.
Ghi chú khác
Khi tạo Hồ sơ cơ sở, bạn cần lưu ý một số điều sau đây:
Hồ sơ cơ sở đã biên dịch phải có dung lượng dưới 1,5 MB. Giới hạn này không áp dụng cho định dạng văn bản trong các tệp nguồn của bạn, thường là lớn hơn nhiều trước khi biên dịch. Xác minh kích thước của Hồ sơ cơ sở nhị phân bằng cách xem cấu phần phần mềm đầu ra trong
assets/dexopt/baseline.prof
đối với APK hoặcBUNDLE-METADATA/com.android.tools.build.profiles/baseline.prof
đối với AAB.Các quy tắc rộng biên dịch quá nhiều ứng dụng có thể làm chậm quá trình khởi động do mức độ truy cập ổ đĩa tăng lên. Nếu chỉ mới bắt đầu sử dụng Hồ sơ cơ sở, bạn không cần phải lo lắng về vấn đề này. Tuy nhiên, tuỳ thuộc vào ứng dụng cũng như kích thước và số lượng hành trình, việc thêm nhiều hành trình có thể khiến hiệu suất kém tối ưu hơn. Hãy kiểm thử hiệu suất ứng dụng của bạn bằng cách thử nhiều hồ sơ và xác minh rằng hiệu suất không giảm sau các lần thêm.