Tổng quan về Hồ sơ cơ sở

Hồ sơ cơ sở cải thiện tốc độ thực thi mã khoảng 30% kể từ lần khởi chạy đầu tiên bằng cách tránh các bước diễn giải và các bước biên dịch trong khi thực thi (JIT) cho các đường dẫn mã đi kèm.

Bằng cách truyền Hồ sơ cơ sở trong một ứng dụng hoặc thư viện, Android Runtime (ART) có thể tối ưu hoá các đường dẫn mã được chỉ định thông qua tính năng biên dịch trước khi thực thi (AOT), cung cấp các tính năng nâng cao hiệu suất cho tất cả những người dùng mới và trong mọi bản cập nhật ứng dụng. Tính năng Tối ưu hoá theo hướng dẫn của hồ sơ (PGO) này cho phép ứng dụng tối ưu hoá quá trình khởi động, giảm hiện tượng giật khi tương tác và cải thiện hiệu suất tổng thể khi chạy cho người dùng từ lần khởi chạy đầu tiên.

Những cải tiến về hiệu suất này trực tiếp cải thiện các chỉ số kinh doanh, chẳng hạn như tỷ lệ giữ chân người dùng, số lượng giao dịch và điểm xếp hạng. Bạn có thể đọc thêm về mức độ ảnh hưởng của các chỉ số kinh doanh đến hiệu suất trong các tin bài của Josh, Lyft, TikTokZomato.

Lợi ích của Hồ sơ cơ sở

Hồ sơ cơ sở giúp mọi hoạt động tương tác của người dùng (chẳng hạn như khởi động ứng dụng, di chuyển giữa các màn hình hoặc cuộn qua nội dung) mượt mà hơn ngay từ lần chạy đầu tiên. Bằng cách tăng tốc độ và khả năng phản hồi của ứng dụng, Hồ sơ cơ sở có thể giúp tăng số người dùng hoạt động hằng ngày và tỷ lệ truy cập trung bình của khách truy cập cũ.

Hồ sơ cơ sở giúp định hướng hoạt động tối ưu hoá ngoài hoạt động khởi động ứng dụng bằng cách cung cấp các hoạt động tương tác phổ biến của người dùng nhằm cải thiện thời gian chạy ứng dụng ngay từ lần khởi chạy đầu tiên. Quá trình biên dịch AOT có hướng dẫn không dựa vào thiết bị của người dùng và có thể được thực hiện một lần trên mỗi bản phát hành trên máy phát triển thay vì trên thiết bị di động. Bằng cách truyền các bản phát hành có Hồ sơ cơ sở, tính năng tối ưu hoá ứng dụng hoạt động nhanh hơn nhiều so với khi chỉ dựa vào Hồ sơ trên đám mây.

Khi không sử dụng Hồ sơ cơ sở, mọi mã ứng dụng đều được biên dịch JIT trong bộ nhớ sau khi được thông dịch hoặc được ghi thành tệp odex trong nền khi thiết bị ở trạng thái rảnh. Sau khi cài đặt hoặc cập nhật một ứng dụng, trong lần đầu tiên chạy ứng dụng đó, người dùng sẽ không có được trải nghiệm tối ưu cho đến khi đường dẫn mã mới được tối ưu hoá. Nhiều ứng dụng đo lường được mức tăng hiệu suất khoảng 30% sau khi tối ưu hoá.

Hồ sơ khởi động

Hồ sơ khởi động tương tự như Hồ sơ cơ sở, nhưng được sử dụng trong thời gian biên dịch thay vì để tối ưu hoá trên thiết bị. Hồ sơ khởi động dùng để tối ưu hoá bố cục của tệp DEX nhằm cải thiện thời gian khởi động. Mã được xác định trong hồ sơ khởi động được đưa vào tệp classes.dex chính còn mã khác được đưa vào các tệp DEX riêng biệt. Điều này giúp cải thiện thời gian khởi động nhờ giảm được số lượng lỗi trang trong quá trình khởi động ứng dụng. Để tìm hiểu thêm về cách hồ sơ khởi động và tính năng tối ưu hoá bố cục DEX cải thiện thời gian khởi động ứng dụng, hãy xem bài viết Tối ưu hoá bố cục DEX và hồ sơ khởi động.

Bắt đầu

Để bắt đầu tối ưu hoá hiệu suất trong ứng dụng hiện có, hãy xem bài viết Tạo Hồ sơ cơ sở.

Chuỗi phần phụ thuộc cung cấp các phiên bản phát hành ổn định và đang trong quá trình phát triển. Để tạo và cài đặt Hồ sơ cơ sở, hãy dùng các phiên bản được hỗ trợ sau hoặc phiên bản cao hơn của trình bổ trợ Android cho Gradle, thư viện Macrobenchmark và Trình cài đặt hồ sơ. Các phần phụ thuộc này cần thiết tại các thời điểm khác nhau và hoạt động cùng nhau dưới dạng một chuỗi công cụ để Hồ sơ cơ sở hoạt động tối ưu.

  • Trình bổ trợ Android cho Gradle: com.android.tools.build:8.0.0
  • Thư viện Macrobenchmark: androidx.benchmark:benchmark-macro-junit4:1.3.0
  • Trình cài đặt hồ sơ: androidx.profileinstaller:profileinstaller:1.3.1

Bạn nên sử dụng phiên bản AGP mới nhất để tạo và quản lý Hồ sơ cơ sở. Dưới đây là những chức năng chính đi kèm với các phiên bản AGP khác nhau:

Phiên bản AGP Tính năng
8,4 Cài đặt ứng dụng cục bộ của các bản dựng không thể gỡ lỗi bằng Công cụ dòng lệnh của trình bao bọc Gradle hoặc cài đặt Hồ sơ cơ sở trên Android Studio, nhờ đó hiệu suất của bản phát hành tại địa phương phù hợp hơn với phiên bản phát hành công khai. Chiến dịch này bản cập nhật này không ảnh hưởng đến hiệu suất phát hành chính thức của Hồ sơ cơ sở.
8.3
  • Hỗ trợ đầy đủ cho thư mục nhóm tài nguyên (mô-đun thư viện): khai báo nhiều tệp nguồn của Hồ sơ cơ sở và sử dụng các thư mục có nhận biết biến thể, chẳng hạn như src/free/generated/baselineProfiles/baseline-prof1.txt, cho các mô-đun thư viện cũng như mô-đun ứng dụng.
  • Hồ sơ cơ sở bao gồm các lớp được đơn giản hoá.
8.2
  • R8 viết lại quy tắc: D8 và R8 có thể biến đổi các quy tắc của Hồ sơ cơ sở và Hồ sơ khởi động mà con người có thể đọc được để nắm bắt đầy đủ mọi quy tắc cần thiết cho việc tối ưu hoá hiệu suất của ứng dụng. Tăng phạm vi sử dụng Hồ sơ cơ sở của các phương thức thêm khoảng 30% và tăng hiệu suất của ứng dụng thêm khoảng 15%.
  • Hồ sơ khởi động: tạo loại Hồ sơ cơ sở mới này để cho biết bố cục của mã trong DEX. Tăng hiệu suất khởi động thêm khoảng 15% hoặc cao hơn đáng kể đối với các ứng dụng lớn.
8.0 Phiên bản tối thiểu nên dùng: sử dụng trình bổ trợ Gradle cho Hồ sơ cơ sở để tạo các Hồ sơ cơ sở bằng một tác vụ Gradle duy nhất.
  • Hỗ trợ đầy đủ cho thư mục nhóm tài nguyên (mô-đun ứng dụng): khai báo nhiều tệp nguồn của Hồ sơ cơ sở và sử dụng các thư mục có nhận biết biến thể (chẳng hạn như src/free/generated/baselineProfiles/baseline-prof1.txt).
7.4 Phiên bản tối thiểu được hỗ trợ: ứng dụng có thể tiêu thụ Hồ sơ cơ sở từ các thư viện và cung cấp Hồ sơ cơ sở của riêng họ trong tệp src/main/baseline-prof.txt.
  • Hồ sơ cơ sở được đóng gói đúng cách khi tạo APK từ một gói ứng dụng (vấn đề #230361284).
  • Đối với ứng dụng có nhiều tệp .dex, Hồ sơ cơ sở sẽ được đóng gói đúng cách cho tệp .dex chính.

Ví dụ về quá trình tạo hồ sơ

Dưới đây là một lớp ví dụ để tạo Hồ sơ cơ sở cho quá trình khởi động ứng dụng, cũng như một số sự kiện điều hướng và cuộn sử dụng thư viện Macrobenchmark được đề xuất:

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

Bạn có thể xem mã này chi tiết hơn và trong ngữ cảnh đầy đủ ở phần mẫu hiệu suất của chúng tôi trên GitHub.

Những điều cần có

Khi sử dụng Hồ sơ cơ sở trong một ứng dụng, bạn có thể bao gồm mã khởi động ứng dụng và hoạt động tương tác phổ biến của người dùng, chẳng hạn như di chuyển giữa các màn hình hoặc cuộn. Bạn cũng có thể thu thập toàn bộ quy trình như đăng ký, đăng nhập hoặc thanh toán. Mọi hành trình của người dùng mà bạn cho là quan trọng đều có thể hưởng lợi nhờ Hồ sơ cơ sở bằng cách cải thiện hiệu suất trong thời gian chạy của chúng.

Nếu bạn đang thử nghiệm nhiều phương pháp để cải thiện hiệu suất, hãy cân nhắc đưa Hồ sơ cơ sở vào cả hai nhóm thử nghiệm. Như vậy, bạn có thể diễn giải kết quả dễ dàng hơn bằng cách đảm bảo tất cả người dùng đều đang chạy mã đã biên dịch một cách nhất quán.

Các thư viện có thể cung cấp Hồ sơ cơ sở riêng và truyền các hồ sơ đó vào bản phát hành để cải thiện hiệu suất của ứng dụng. Ví dụ: hãy xem phần Sử dụng Hồ sơ cơ sở trong bài viết về hiệu suất của Jetpack Compose.

Cách hoạt động của Hồ sơ cơ sở

Trong khi phát triển ứng dụng hoặc thư viện, hãy cân nhắc xác định Hồ sơ cơ sở để bao gồm các hoạt động tương tác phổ biến của người dùng, với sự chú trọng vào thời gian kết xuất hoặc độ trễ. Dưới đây là cách hoạt động:

  1. Các quy tắc hồ sơ mà con người có thể đọc được sẽ được tạo cho ứng dụng của bạn và được biên dịch thành dạng nhị phân trong ứng dụng. Bạn có thể tìm thấy các quy tắc đó tại assets/dexopt/baseline.prof. Sau đó, bạn có thể tải tệp AAB lên Google Play như bình thường.

  2. Google Play xử lý hồ sơ và giao hồ sơ trực tiếp cho người dùng cùng với APK. Trong quá trình cài đặt, ART thực hiện việc biên dịch trước khi thực thi (AOT) các phương thức trong hồ sơ, nhờ thế mà các phương thức đó được thực thi nhanh hơn. Nếu hồ sơ chứa các phương thức dùng khi khởi chạy ứng dụng hoặc trong quá trình kết xuất khung hình, thì người dùng có thể thấy thời gian khởi chạy nhanh hơn và giảm hiện tượng giật.

  3. Quy trình này kết hợp với tính năng tổng hợp Hồ sơ trên đám mây để tinh chỉnh hiệu suất dựa trên mức sử dụng thực tế của ứng dụng theo thời gian.

Hình 1. Sơ đồ này minh hoạ quy trình hoạt động của Hồ sơ cơ sở từ lúc tải lên đến khi phân phối đến người dùng cuối và mối quan hệ giữa quy trình hoạt động đó với Hồ sơ trên đám mây.

Hồ sơ trên đám mây

Hồ sơ trên đám mây cung cấp một dạng Tối ưu hoá theo hồ sơ (PGO) bổ sung (được Cửa hàng Google Play tổng hợp và phân phối để biên dịch khi cài đặt) cùng với Hồ sơ cơ sở.

Mặc dù Hồ sơ trên đám mây do hoạt động tương tác của người dùng trong ứng dụng thực tế định hướng, nhưng vẫn mất từ vài giờ đến vài ngày sau khi bản cập nhật được phân phối, điều này giới hạn khả năng hoạt động của những hồ sơ đó. Cho đến khi hồ sơ được phân phối đầy đủ, hiệu suất của ứng dụng sẽ ở dưới mức tối ưu đối với những người dùng ứng dụng mới hoặc ứng dụng đã cập nhật. Ngoài ra, Hồ sơ trên đám mây chỉ hỗ trợ các thiết bị Android chạy Android 9 (API cấp 28) trở lên và chỉ phát triển tốt đối với những ứng dụng có cơ sở người dùng đủ lớn.

Hành vi biên dịch trên các phiên bản Android

Các phiên bản Nền tảng Android sử dụng nhiều phương pháp biên dịch ứng dụng, mỗi phương pháp đều có sự đánh đổi hiệu suất tương ứng. Hồ sơ cơ sở cải thiện theo các phương thức biên dịch trước đó bằng cách cung cấp một hồ sơ cho mọi lượt cài đặt.

Phiên bản Android Phương pháp biên dịch Phương pháp tối ưu hoá
5 đến 6 (API cấp 21 đến 23) AOT đầy đủ Toàn bộ ứng dụng được tối ưu hoá trong quá trình cài đặt, dẫn đến thời gian chờ sử dụng ứng dụng lâu, tăng mức sử dụng RAM và dung lượng ổ đĩa, tăng thời gian tải mã từ ổ đĩa, và có thể làm tăng thời gian khởi động nguội.
7 đến 8.1 (API cấp 24 đến 27) AOT một phần (Hồ sơ cơ sở) Hồ sơ cơ sở được androidx.profileinstaller cài đặt trong lần chạy đầu tiên, khi mô-đun ứng dụng xác định phần phụ thuộc này. ART có thể cải thiện điều này hơn nữa bằng cách thêm các quy tắc hồ sơ khác trong quá trình ứng dụng sử dụng và biên dịch những quy tắc này khi thiết bị ở trạng thái rảnh. Cách này sẽ tối ưu hoá dung lượng ổ đĩa và thời gian tải mã từ ổ đĩa, từ đó giảm thời gian chờ cho ứng dụng.
9 (API cấp 28) trở lên AOT một phần (Hồ sơ cơ sở + Hồ sơ trên đám mây) Play sử dụng Hồ sơ cơ sở trong quá trình cài đặt ứng dụng để tối ưu hoá APK và Hồ sơ trên đám mây (nếu có). Sau khi cài đặt, hồ sơ ART được tải lên Play và tổng hợp rồi được cung cấp dưới dạng Hồ sơ trên đám mây cho những người dùng khác khi họ cài đặt hoặc cập nhật ứng dụng.

Vấn đề đã biết

Sau đây là các vấn đề có thể xảy ra và giải pháp tương ứng hoặc các vấn đề đang trong quá trình tìm hướng giải quyết:

  • Quá trình tạo Hồ sơ cơ sở có thể không thành công do chế độ cài đặt quyền trên một số thiết bị, bao gồm cả thiết bị OnePlus. Để khắc phục vấn đề này, hãy tắt tuỳ chọn Tắt tính năng giám sát quyền trong phần cài đặt Tuỳ chọn cho nhà phát triển.

  • Tính năng tạo Hồ sơ cơ sở không được hỗ trợ trên các thiết bị trong Phòng thử nghiệm Firebase. bao gồm cả các thiết bị trong Phòng thử nghiệm do Gradle quản lý (vấn đề #285187547).

  • Để cung cấp thành công Hồ sơ cơ sở cho các thư viện, hãy sử dụng Trình bổ trợ Gradle cho Hồ sơ cơ sở 1.2.3 hoặc AGP 8.3 trở lên (vấn đề #313992099).

  • Nếu bạn tạo Hồ sơ cơ sở bằng lệnh ./gradlew app:generateBaselineProfile, điểm chuẩn trong mô-đun kiểm thử cũng chạy và kết quả bị loại bỏ. Nếu điều này xảy ra, bạn chỉ có thể tạo Hồ sơ cơ sở bằng cách chạy lệnh với -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. Vấn đề này đã được khắc phục trong AGP 8.2.

  • Lệnh tạo Hồ sơ cơ sở cho mọi loại bản dựng: ./gradlew app:generateBaselineProfile – chỉ tạo Hồ sơ cơ sở cho loại bản phát hành. Vấn đề này đã được khắc phục trong AGP 8.1.

  • Các kênh phân phối ứng dụng không phải Cửa hàng Google Play có thể sẽ không hỗ trợ việc sử dụng Hồ sơ cơ sở tại thời điểm cài đặt. Người dùng ứng dụng cài đặt qua các kênh này sẽ không thấy được lợi ích cho đến khi tính năng dexopt ở chế độ nền chạy (thường là chạy qua đêm).

  • Tính năng Chia sẻ ứng dụng nội bộ trên Cửa hàng Play không hỗ trợ Hồ sơ cơ sở. Tuy nhiên, kênh kiểm thử nội bộ có hỗ trợ.

  • Hoạt động tối ưu hoá pin trên một số thiết bị, chẳng hạn như thiết bị Huawei, có thể ảnh hưởng đến khi cài đặt hồ sơ. Để giúp đảm bảo rằng các hồ sơ của bạn sẽ được cài đặt tắt mọi tính năng tối ưu hoá pin trên thiết bị đo điểm chuẩn một cách hiệu quả.

Tài nguyên khác