Tạo hồ sơ khởi động

Hồ sơ khởi động là một tập hợp con của Hồ sơ cơ sở. Hệ thống xây dựng sử dụng Hồ sơ khởi động để tối ưu hoá thêm các lớp và phương thức mà các hồ sơ này chứa bằng cách cải thiện bố cục của mã trong các tệp DEX của APK. Có hồ sơ khởi động, quá trình khởi động ứng dụng của bạn thường nhanh hơn từ 15% đến 30% so với cơ sở Chỉ hồ sơ.

Hình 1. Cải thiện vị trí của mã từ bố cục DEX tối ưu hoá.

Yêu cầu

Bạn nên sử dụng Hồ sơ khởi động bằng các công cụ sau:

  • Jetpack Macrobenchmark 1.2.0 trở lên
  • Trình bổ trợ Android cho Gradle 8.2 trở lên
  • Android Studio Iguana trở lên

Ngoài ra, bạn cần có các chế độ cài đặt sau trong ứng dụng:

  • Đã bật R8. Đối với bản phát hành, đặt isMinifyEnabled = true.
  • Đã bật tính năng tối ưu hoá bố cục DEX. Trong khối baselineProfile {} của tệp bản dựng của mô-đun ứng dụng, hãy đặt dexLayoutOptimization = true.

Tạo Hồ sơ khởi động

Android Studio tạo Hồ sơ khởi động cùng với Hồ sơ cơ sở khi bạn hãy sử dụng mẫu trình tạo Hồ sơ cơ sở mặc định.

Các bước chung để tạo và tạo Hồ sơ khởi động cũng giống như các bước để tạo Hồ sơ cơ sở.

Cách mặc định để tạo Hồ sơ khởi động là sử dụng mẫu mô-đun Trình tạo hồ sơ cơ sở trong Android Studio. Điều này bao gồm cả việc khởi động các hoạt động tương tác tạo thành một Hồ sơ khởi động cơ bản. Để tăng cường Hồ sơ khởi động này có nhiều Hành trình trọng yếu của người dùng (CUJ), hãy thêm CUJ khởi động ứng dụng của bạn vào một rule với includeInStartupProfile được đặt thành true. Đối với các ứng dụng đơn giản, việc chạy MainActivity của ứng dụng có thể là đủ. Đối với các ứng dụng phức tạp hơn, hãy cân nhắc việc thêm các điểm truy cập phổ biến nhất vào ứng dụng, chẳng hạn như khởi động ứng dụng từ màn hình chính hoặc khởi chạy vào một đường liên kết sâu.

Đoạn mã sau đây cho thấy một trình tạo Hồ sơ cơ sở (theo mặc định, BaselineProfileGenerator.kt) bao gồm việc khởi động ứng dụng từ màn hình chính và khởi chạy trong một liên kết sâu. Liên kết sâu sẽ trực tiếp chuyển đến nguồn cấp tin tức của ứng dụng chứ không phải màn hình chính của ứng dụng.

@RunWith(AndroidJUnit4::class)
@LargeTest
class BaselineProfileGenerator {

    @get:Rule
    val rule = BaselineProfileRule()

    @Test
    fun generate() {
        rule.collect(
            packageName = "com.example.app",
            includeInStartupProfile = true
        ) {
            // Launch directly into the NEWS_FEED.
            startActivityAndWait(Intent().apply {
                setPackage(packageName)
                setAction("com.example.app.NEWS_FEED")
            })
        }
    }
}

Chạy cấu hình Tạo hồ sơ cơ sở cho ứng dụng rồi tìm Quy tắc của Hồ sơ khởi động tại src/<variant>/generated/baselineProfiles/startup-prof.txt.

Xác nhận tối ưu hoá Hồ sơ khởi động

Để xác nhận việc tối ưu hoá bố cục DEX, hãy sử dụng Android Studio để mở APK và xác minh các lớp trong tệp DEX. Đảm bảo classes.dex chính không được điền đầy. Nếu ứng dụng của bạn bao gồm một tệp DEX duy nhất, bạn có thể kiểm tra xem ứng dụng có chứa hai tệp DEX hay không sau khi bật Hồ sơ khởi động.

Android Studio sẽ cảnh báo cho bạn nếu các lớp khởi động không vừa trong một tệp DEX. Để nhận thông tin chẩn đoán bao gồm số lượng phương thức không khởi động trong các lớp khởi động, hãy nhớ cập nhật trình biên dịch R8 lên phiên bản ít nhất 8.3.36-dev bằng cách thực hiện các thay đổi sau đối với tệp settings.gradle khi bạn áp dụng Hồ sơ khởi động:

Kotlin

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url = uri("https://storage.googleapis.com/r8-releases/raw")
            }
        }
        dependencies {
            classpath("com.android.tools:r8:8.3.6-dev")
        }
    }
}

Groovy

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url uri('https://storage.googleapis.com/r8-releases/raw')
            }
        }
        dependencies {
            classpath 'com.android.tools:r8:8.3.6-dev"
        }
    }
}

Hãy nhớ thêm --info sau assembleRelease trong lệnh sau đây khi tạo bản dựng bằng Gradle.

./gradlew assembleRelease --info

Sau đó, thông tin chẩn đoán sẽ được in ra thiết bị đầu cuối.

Nếu ứng dụng hoặc thư viện của bạn tham chiếu đến bất kỳ API đơn giản hoá nào, thì các phương thức triển khai khả năng tương thích đi kèm của các lớp này luôn có trong tệp DEX cuối cùng. Tệp DEX gần đây nhất đã được đơn giản hoá này không tham gia vào bố cục DEX tối ưu hoá.

Những điều cần cân nhắc khi tạo hồ sơ khởi động

Kết quả về các lớp và phương thức của hồ sơ khởi động bị giới hạn bởi kích thước của tệp classes.dex đầu tiên. Điều này có nghĩa là không phải mọi hành trình của hồ sơ cơ sở cũng phải là hành trình của hồ sơ khởi động.

Để quyết định những hành trình của người dùng cần đề cập khi tạo hồ sơ khởi động, hãy cân nhắc nơi hầu hết người dùng khởi động ứng dụng. Thông thường đó là từ trình chạy và sau khi đăng nhập. Đây cũng là hồ sơ cơ sở cơ bản nhất hành trình.

Sau khi đã hoàn thành trường hợp sử dụng đầu tiên, hãy theo dõi phễu người dùng cho ứng dụng của bạn. Trong nhiều trường hợp, phễu khởi động ứng dụng tuân theo danh sách sau:

  1. Hoạt động của trình chạy chính
  2. Thông báo kích hoạt quá trình khởi động ứng dụng
  3. Hoạt động của trình chạy không bắt buộc

Thao tác danh sách này từ trên cùng và dừng trước khi classes.dex đầy. Để che phủ các hành trình khác sau đó, hãy di chuyển mã ra khỏi đường dẫn khởi động và thêm các mã khác hành trình của họ. Để di chuyển mã ra khỏi đường dẫn khởi động, hãy kiểm tra dấu vết Perfetto trong quá trình khởi động ứng dụng và tìm kiếm các hoạt động diễn ra trong thời gian dài. Bạn cũng có thể sử dụng macrobenchmark với tính năng theo dõi phương thức được bật để xem toàn bộ và tự động hoá các lệnh gọi phương thức trong quá trình khởi động ứng dụng.