Tạo Hồ sơ cơ sở

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

  1. Thiết lập mô-đun Macrobenchmark trong dự án Gradle của bạn.

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

  3. (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ựng benchmark 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 managedDevicesdevices 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)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ợ

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:

  1. Tạo một mô-đun com.android.test mới – ví dụ: :baseline-profile.
  2. Định cấu hình build.gradle cho :baseline-profile:
    1. Áp dụng trình bổ trợ androidx.baselineprofile.
    2. Đảm bảo targetProjectPath trỏ đến mô-đun :app.
    3. 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.
    4. Áp dụng cấu hình bạn muốn, như trong ví dụ sau.

    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
    }
    
  3. 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.
  4. 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;
                })
            }
        }
    }
    
  5. Cập nhật cấu hình trong build.gradle của mô-đun ứng dụng :app.
    1. Áp dụng trình bổ trợ androidx.baselineprofile.
    2. Thêm phần phụ thuộc baselineProfile vào mô-đun :baseline-profile.

    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"'
    }
    
  6. Tạo hồ sơ bằng cách chạy mã sau: ./gradlew :app:generateBaselineProfile.

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:

  1. Tạo một mô-đun com.android.test mới – ví dụ: :baseline-profile.
  2. Định cấu hình build.gradle cho :baseline-profile:
    1. Áp dụng trình bổ trợ androidx.baselineprofile.
    2. Đảm bảo targetProjectPath trỏ đến mô-đun :sample-app.
    3. Thêm GMD (không bắt buộc). Trong ví dụ sau, đó là pixel6Api31.
    4. Áp dụng cấu hình bạn muốn, như trong ví dụ sau.

    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
    }
    
  3. 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.
  4. Cập nhật cấu hình trong build.gradle của mô-đun thư viện :library.
    1. Áp dụng trình bổ trợ androidx.baselineprofile.
    2. Thêm phần phụ thuộc baselineProfile vào mô-đun :baseline-profile.
    3. Á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.

    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.**'
        }
    }
    
  5. 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.
  6. 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.
    
  7. Tạo hồ sơ bằng cách chạy mã sau: ./gradlew :library:generateBaselineProfile.

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ô-đun com.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ành true để 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ành false để 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ữ trong src/<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ới com.example.foocom.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ới com.example.foo nhưng không khớp với com.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:

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

  2. 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ào src/main/baselineProfiles.

  3. 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")
    }
    
  4. 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ặc BUNDLE-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.

Lớp học lập trình

Tìm hiểu kỹ hơn về việc dùng Macrobenchmark để đo lường hiệu suất.
Tạo Hồ sơ cơ sở tuỳ chỉnh phù hợp với ứng dụng Android rồi xác minh tính hiệu quả của hồ sơ đó.