Định cấu hình quá trình tạo 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ở. Trình bổ trợ này giúp bạn thực hiện những việc sau:

Trang này giải thích cách sử dụng trình bổ trợ Gradle cho Hồ sơ cơ sở để tuỳ chỉnh quá trình tạo Hồ sơ cơ sở.

Yêu cầu đối với trình bổ trợ

Sử dụng một Thiết bị do Gradle quản lý để tạo Hồ sơ cơ sở

Để sử dụng Thiết bị do Gradle quản lý (GMD) để tạo Hồ sơ cơ sở, hãy thêm một GMD vào cấu hình build.gradle.kts của mô-đun trình tạo hồ sơ— có thể là mô đun kiểm thử :baselineprofile — như minh hoạ trong ví dụ sau:

Kotlin

android {
   testOptions.managedDevices.devices {
       create<com.android.build.api.dsl.ManagedVirtualDevice>("pixel6Api31") {
           device = "Pixel 6"
           apiLevel = 31
           systemImageSource = "aosp"
       }
   }
}

Groovy

android {
   testOptions.managedDevices.devices {
       pixel6Api31(ManagedVirtualDevice) {
           device 'Pixel 6'
           apiLevel = 31
           systemImageSource 'aosp'
       }
   }
}

Sử dụng GMD để tạo Hồ sơ cơ sở bằng cách thêm GMD vào cấu hình trình bổ trợ Gradle cho Hồ sơ cơ sở như sau:

Kotlin

baselineProfile {
    managedDevices += "pixel6Api31"
}

Groovy

baselineProfile {
    managedDevices = ['pixel6Api31']
}

Nếu sử dụng GMD để tạo Hồ sơ cơ sở, hãy đặt useConnectedDevices thành false:

Kotlin

baselineProfile {
    ...
    useConnectedDevices = false
}

Groovy

baselineProfile {
    ...
    useConnectedDevices false
}

Tạo Hồ sơ cơ sở cho nhiều biến thể

Bạn có thể tạo Hồ sơ cơ sở cho mỗi biến thể, mỗi phiên bản hoặc tạo dưới dạng một tệp duy nhất để sử dụng cho mọi biến 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
}

Groovy

baselineProfile {
    mergeIntoMain true
}

Để hợp nhất các hồ sơ đã tạo cho tất cả biến thể thành một hồ sơ duy nhất, hãy đặt mergeIntoMain thành true. 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. Vì vậy, sẽ chỉ có một tác vụ Gradle duy nhất có tên là generateBaselineProfile. Dữ liệu đầu ra của hồ sơ nằm ở src/main/generated/baselineProfiles.

Để tắt tính năng hợp nhất và mỗi biến thể đều có một hồ sơ riêng, hãy đặt mergeIntoMain thành false. Trong trường hợp này, sẽ có nhiều tác vụ Gradle riêng cho biến thể. Ví dụ: khi có hai phiên bản (chẳng hạn như miễn phí và có tính phí) và một loại bản phát hành, các tác vụ sẽ như sau:

* `generateFreeReleaseBaselineProfile`
* `generatePaidReleaseBaselineProfile`
* `generateReleaseBaselineProfile`

Để chỉ định hành vi hợp nhất cho mỗi biến thể, hãy sử dụng đoạn mã sau:

Kotlin

baselineProfile {
    variants {
        freeRelease {
            mergeIntoMain = true
        }
    }
}

Groovy

baselineProfile {
    variants {
        freeRelease {
            mergeIntoMain true
        }
    }
}

Trong ví dụ trước, các biến thể có 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ể có cờ được đặt thành false sẽ được lưu giữ trong thư mục src/<variant>/generated/baselineProfiles.

Theo mặc định, mergeIntoMain được đặt thành true đối với thư viện và false đối với ứng dụng.

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ể định cấu hình Hồ sơ cơ sở để tự động tạo cho mọi bản phát hành, thay vì sử dụng tác vụ generateBaselineProfile theo cách thủ công. Nhờ tạo tự động, hồ sơ mới nhất sẽ được đưa vào bản phát hành.

Để bật tính năng tạo tự động cho bản phát hành, hãy sử dụng cờ automaticGenerationDuringBuild:

Kotlin

baselineProfile {
    automaticGenerationDuringBuild = true
}

Groovy

baselineProfile {
    automaticGenerationDuringBuild true
}

Việc đặt cờ automaticGenerationDuringBuild thành true sẽ kích hoạt quá trình tạo Hồ sơ cơ sở mới cho mỗi tập hợp bản phát hành. Tức 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, khởi động việc kiểm thử đo lường cho Hồ sơ cơ sở và tạo bản dựng Hồ sơ cơ sở để chạy chương trình kiểm thử này. Tuy việc tạo tự động giúp 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ả quá trình 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 {
            automaticGenerationDuringBuild = true
        }
    }
}

Groovy

baselineProfile {
    variants {
        freeRelease {
            automaticGenerationDuringBuild true
        }
    }
}

Trong ví dụ trước, tác vụ generateFreeReleaseBaselineProfile sẽ chạy khi khởi động assembleFreeRelease. Một trường hợp sử dụng là khi người dùng muốn có 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. Với cách này, khi chuyển giao (commit) mã, bạn sẽ không lưu hồ sơ mới nhất được tạo.

Kotlin

baselineProfile {
    saveInSrc = true
}

Groovy

baselineProfile {
    saveInSrc true
}

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
        }
    }
}

Groovy

baselineProfile {
    variants {
        freeRelease {
            saveInSrc true
        }
    }
}

Lọc quy tắc hồ sơ

Trình bổ trợ Gradle cho Hồ sơ cơ sở cho phép bạn lọc các quy tắc Hồ sơ cơ sở đã tạo. Thao tác này đặc biệt hữu í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 đó. Bộ lọc có thể bao gồm và loại trừ gói và lớp cụ thể. 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ừ còn mọi nội dung khác sẽ được bao gồm.

Nội dung trong bộ lọc có thể chứa bất kỳ giá trị 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.methodcom.example.method.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.method nhưng không khớp với com.example.method.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.**'
    }
}

Tuỳ chỉnh quy tắc lọc cho các biến thể 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.**'
            }
        }
    }
}

Bạn cũng có thể lọc các quy tắc bằng cách sử dụng đối số filterPredicate trong BaselineProfileRule.collect(), nhưng bạn nên sử dụng trình bổ trợ Gradle để lọc vì nó mang đến một cách đơn giản hơn để lọc các gói con và một nơi duy nhất để định cấu hình toàn bộ mô-đun.

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 hơn. Hãy kiểm thử hiệu suất của ứng dụng 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ượt thêm.

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

Tìm hiểu chi tiết 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ơ đó.