Hướng dẫn

Hướng dẫn về cấp độ trong hành trình nâng cao hiệu suất

Đọc trong 9 phút
Alice Yuan
Kỹ sư Quan hệ với nhà phát triển

Hướng dẫn nâng cấp trong hành trình nâng cao hiệu suất

Chào mừng bạn đến với ngày thứ 4 của Tuần lễ chú trọng hiệu suất. Giờ đây, bạn đã tìm hiểu về một số công cụ hữu ích và phương pháp hay nhất mà chúng tôi đã giới thiệu gần đây, chẳng hạn như Trình tối ưu hoá R8 và tính năng Tối ưu hoá theo hướng dẫn của hồ sơ bằng Hồ sơ cơ sởHồ sơ khởi động. Có thể bạn đang thắc mắc nên bắt đầu hành trình cải thiện hiệu suất từ đâu.

Chúng tôi đã đưa ra hướng dẫn từng bước về việc phân cấp hiệu suất để hỗ trợ nhóm phát triển ứng dụng di động của bạn, cho dù bạn là một nhà phát triển ứng dụng đang muốn bắt đầu với hiệu suất hay bạn có cả một nhóm chuyên cải thiện hiệu suất trên Android. 

Hướng dẫn phân cấp hiệu suất có 5 cấp độ. Chúng tôi sẽ bắt đầu với cấp độ 1 (giới thiệu công cụ hiệu suất cần ít nỗ lực áp dụng nhất) và tăng dần đến cấp độ 5 (phù hợp với những ứng dụng có đủ nguồn lực để duy trì một khung hiệu suất riêng).

 
Bạn có thể chuyển đến cấp độ phù hợp nhất với mình:

Cấp 1:  Sử dụng tính năng giám sát trường do Play Console cung cấp

Trước tiên, bạn nên tận dụng Android vitals trong Play Console để xem dữ liệu giám sát trường được thu thập tự động, nhờ đó bạn có thông tin chi tiết về ứng dụng của mình mà không tốn nhiều công sức.

Android vitals là một sáng kiến của Google nhằm tự động thu thập và hiển thị dữ liệu trường này cho bạn.

Sau đây là phần giải thích về cách chúng tôi cung cấp dữ liệu này:

  1. Thu thập dữ liệu:  Khi người dùng chọn tham gia, thiết bị Android của họ sẽ tự động ghi lại các sự kiện chính về hiệu suất và độ ổn định từ tất cả các ứng dụng, kể cả ứng dụng của bạn.
  2. Dữ liệu tổng hợp: Google Play thu thập và ẩn danh dữ liệu này từ người dùng ứng dụng của bạn.
  3. Thông tin chi tiết về nền tảng: Dữ liệu được trình bày cho bạn trong trang tổng quan Android vitals trong Google Play Console.

Trang tổng quan Android vitals theo dõi nhiều chỉ số, nhưng một số chỉ số được chỉ định là Các chỉ số quan trọng chính. Đây là những chỉ số quan trọng nhất vì chúng có thể ảnh hưởng đến khả năng hiển thị và thứ hạng của ứng dụng trên Cửa hàng Google Play.

Các chỉ số quan trọng chính

CÁC CHỈ SỐ CHÍNH VỀ CHẤT LƯỢNG KỸ THUẬT CỦA GOOGLE PLAY

Để tối đa hoá khả năng xuất hiện trên Google Play, hãy đảm bảo ứng dụng của bạn không vượt quá ngưỡng hành vi xấu đối với những chỉ số này.

Tỷ lệ sự cố mà người dùng nhận thấyTỷ lệ phần trăm số người dùng hoạt động hằng ngày gặp phải ít nhất một sự cố có thể nhận thấy
Tỷ lệ lỗi ANR mà người dùng nhận thấyTỷ lệ phần trăm số người dùng hoạt động hằng ngày gặp phải ít nhất một lỗi ANR mà người dùng có thể đã chú ý
Mức sử dụng pin rất caoTỷ lệ phần trăm số phiên sử dụng mặt đồng hồ với mức sử dụng pin vượt quá 4,44% mỗi giờ
Mới: Tỷ lệ khoá chế độ thức một phần quá mứcTỷ lệ phần trăm số phiên người dùng mà trong đó, mức sử dụng khoá chế độ thức tích luỹ (không được miễn trừ) vượt quá 2 giờ

Các chỉ số quan trọng chính bao gồm tỷ lệ sự cố mà người dùng nhận thấy, Tỷ lệ ANR, mức sử dụng pin quá mức và chỉ số mới được giới thiệu về lỗi khoá một phần chế độ thức quá mức.

Tỷ lệ lỗi ANR mà người dùng nhận thấy

Bạn có thể sử dụng trang tổng quan về lỗi ANR của Android Vitals để xem dấu vết ngăn xếp của các vấn đề xảy ra trên thực tế, đồng thời nhận thông tin chi tiết và đề xuất về cách khắc phục vấn đề. 

crashesAnrs.png

Bạn có thể xem chi tiết về một lỗi ANR cụ thể đã xảy ra để xem dấu vết ngăn xếp cũng như thông tin chi tiết về nguyên nhân có thể gây ra vấn đề.

insights.png

Ngoài ra, hãy tham khảo hướng dẫn về lỗi ANR của chúng tôi để giúp bạn chẩn đoán và khắc phục các trường hợp thường gặp có thể xảy ra lỗi ANR. 

Tỷ lệ sự cố mà người dùng nhận thấy 

Sử dụng trang tổng quan về sự cố của Android vitals để gỡ lỗi thêm về sự cố và xem mẫu dấu vết ngăn xếp xảy ra trong ứng dụng của bạn. 

Tài liệu của chúng tôi cũng có hướng dẫn về cách khắc phục sự cố cụ thể. Ví dụ: Hướng dẫn khắc phục sự cố đối với các dịch vụ trên nền trước thảo luận về các cách xác định và khắc phục những trường hợp phổ biến gây ra sự cố.

Mức sử dụng pin quá cao 

Để giảm số phiên sử dụng mặt đồng hồ có mức sử dụng pin quá cao trên Wear OS, hãy xem hướng dẫn về cách cải thiện và tiết kiệm pin trên Wear

[mới] Tỷ lệ khoá chế độ thức một phần quá mức

 

Gần đây, chúng tôi đã thông báo rằng những ứng dụng vượt quá ngưỡng khoá chế độ thức một phần quá mức có thể phải chịu thêm các biện pháp xử lý kể từ ngày 1 tháng 3 năm 2026

Đối với thiết bị di động, chỉ số Android vitals áp dụng cho các khoá chế độ thức không được miễn trừ, được thu thập trong khi màn hình tắt và ứng dụng đang chạy ở chế độ nền hoặc đang chạy một dịch vụ trên nền trước. Android vitals coi việc sử dụng khoá chế độ thức một phần là quá mức nếu khoá chế độ thức được giữ trong ít nhất 2 giờ trong khoảng thời gian 24 giờ và ảnh hưởng đến hơn 5% số phiên của ứng dụng (tính trung bình trong 28 ngày).

Để gỡ lỗi và khắc phục các vấn đề về khoá chế độ thức quá mức, hãy xem bài đăng trên blog kỹ thuật của chúng tôi.

Tham khảo tài liệu về Android vitals và tiếp tục hành trình tận dụng Android vitals một cách hiệu quả hơn.

Cấp 2: Thực hiện các mục hành động của Điểm hiệu suất của ứng dụng

Tiếp theo, hãy chuyển sang sử dụng Điểm hiệu suất của ứng dụng để tìm những mục hành động có tác động lớn nhằm nâng cao hiệu suất của ứng dụng.

Điểm hiệu suất ứng dụng Android là một khung tiêu chuẩn để đo lường hiệu suất kỹ thuật của ứng dụng. Chỉ số này nằm trong khoảng từ 0 đến 100, trong đó chỉ số càng thấp có nghĩa là bạn càng cần cải thiện.

Để dễ dàng giành chiến thắng, trước tiên, bạn nên bắt đầu bằng Điểm hiệu suất tĩnh. Đây thường là những thay đổi về cấu hình hoặc bản cập nhật công cụ giúp tăng hiệu suất đáng kể.

Bước 1: Thực hiện quy trình Đánh giá tĩnh

Quy trình đánh giá tĩnh sẽ đánh giá cấu hình và việc áp dụng công cụ của dự án. Đây thường là những cách nhanh nhất để cải thiện hiệu suất.

Chuyển đến phần Static Score (Điểm số tĩnh) của trang bảng điểm rồi thực hiện các thao tác sau:

  1. Đánh giá phiên bản Trình bổ trợ Android cho Gradle (AGP).
  2. Áp dụng tính năng Rút gọn R8 từng bước hoặc lý tưởng nhất là sử dụng R8 ở chế độ đầy đủ để rút gọn và tối ưu hoá mã ứng dụng.
  3. Áp dụng Hồ sơ cơ sở để cải thiện tốc độ thực thi mã kể từ lần khởi chạy đầu tiên, giúp nâng cao hiệu suất cho mọi lượt cài đặt ứng dụng mới và mọi bản cập nhật ứng dụng.
  4. Áp dụng Hồ sơ khởi động để cải thiện Bố cục Dex. Hệ thống xây dựng dùng Hồ sơ khởi động để tối ưu hoá thêm các lớp và phương thức mà hồ sơ này chứa bằng cách cải thiện bố cục mã trong các tệp DEX của APK.
  5. Nâng cấp lên phiên bản Jetpack Compose mới nhất

Bước 2: Thực hiện quy trình Đánh giá linh hoạt

Sau khi bạn áp dụng các điểm cải tiến tĩnh dễ thực hiện, hãy sử dụng quy trình đánh giá động để xác thực các điểm cải thiện trên một thiết bị thực. Trước tiên, bạn có thể thực hiện việc này theo cách thủ công bằng thiết bị thực và đồng hồ bấm giờ.

Chuyển đến phần Tỷ số linh hoạt trên trang bảng tỷ số rồi thực hiện các thao tác sau:

  1. Thiết lập môi trường thử nghiệm bằng một thiết bị thực. Hãy cân nhắc sử dụng một thiết bị cấp thấp để phóng đại các vấn đề về hiệu suất, giúp bạn dễ dàng phát hiện ra chúng.
  2. Đo thời gian khởi động từ trình chạy. Khởi động nguội ứng dụng của bạn từ biểu tượng trình chạy và đo thời gian cho đến khi ứng dụng có thể tương tác.
  3. Đo thời gian khởi động ứng dụng từ một thông báo, với mục tiêu giảm thời gian khởi động thông báo xuống dưới vài giây.
  4. Đo lường hiệu suất kết xuất bằng cách di chuyển qua các màn hình và ảnh động chính.

Sau khi hoàn tất các bước này, bạn sẽ nhận được điểm số từ 1 đến 100 cho điểm số tĩnh và động, giúp bạn hiểu được hiệu suất của ứng dụng và biết được bạn cần tập trung vào điểm nào.

Cấp độ 3: Tận dụng các khung kiểm thử hiệu suất cục bộ

Sau khi bắt đầu đánh giá hiệu suất động, bạn có thể thấy việc đo lường hiệu suất theo cách thủ công quá tẻ nhạt. Hãy cân nhắc tự động hoá quy trình kiểm thử hiệu suất bằng cách sử dụng các khung kiểm thử hiệu suất như Macrobenchmark và UiAutomator.

Macrobenchmark 💚 UiAutomator

Hãy coi Macrobenchmark và UiAutomator là hai công cụ hoạt động cùng nhau: Macrobenchmark là công cụ đo lường. Đây là một công cụ giống như đồng hồ bấm giờ và bộ đếm tốc độ khung hình chạy bên ngoài ứng dụng của bạn. Công cụ này chịu trách nhiệm khởi động ứng dụng, ghi lại các chỉ số (chẳng hạn như thời gian khởi động hoặc số khung hình bị bỏ qua) và dừng ứng dụng. UiAutomator là người dùng robot. Thư viện này cho phép bạn viết mã để tương tác với màn hình của thiết bị. Tính năng này có thể tìm biểu tượng, nhấn nút,  di chuyển trên danh sách và làm nhiều việc khác.

Cách viết bài kiểm thử

Khi viết một bài kiểm thử, bạn sẽ bao bọc mã UiAutomator bên trong một khối Macrobenchmark.

  1. Xác định bài kiểm tra: Sử dụng @MacrobenchmarkRule
  2. Bắt đầu đo lường: Gọi benchmarkRule.measureRepeated.
  3. Điều khiển giao diện người dùng: Bên trong khối đó, hãy dùng mã UiAutomator để chạy ứng dụng, tìm các phần tử trên giao diện người dùng và tương tác với các phần tử đó.

Sau đây là ví dụ về đoạn mã cho thấy cách kiểm thử danh sách thành phần để tìm hiện tượng giật khi cuộn.

benchmarkRule.measureRepeated(

    // ...

    metrics = listOf(

        FrameTimingMetric(),

    ),

    startupMode = StartupMode.COLD,

    iterations = 10,

) {

    // 1. Launch the app's main activity

    startApp()

    // 2. Find the list using its resource ID and scroll down

    onElement { viewIdResourceName == "$packageName.my_list" }

        .fling(Direction.DOWN)

}

4. Xem xét kết quả: Mỗi lần chạy thử nghiệm sẽ cung cấp cho bạn thông tin được đo lường chính xác để mang đến dữ liệu tốt nhất về hiệu suất của ứng dụng.

timeToInitialDisplayMs  min  1894.4,   median 2847.4,   max  3355.6


frameOverrunMs          P50 -3.2,  P90  6.2, P95  10.4, P99  119.5

Các trường hợp sử dụng phổ biến

Macrobenchmark cung cấp một số chỉ số cốt lõi ngay từ đầu. StartupTimingMetric cho phép bạn đo lường chính xác quá trình khởi động ứng dụng. FrameTimingMetric giúp bạn nắm được hiệu suất kết xuất của ứng dụng trong quá trình kiểm thử.

Chúng tôi có một hướng dẫn chi tiết và đầy đủ về cách sử dụng MacrobenchmarkUiAutomator cùng với mã mẫu để bạn tiếp tục tìm hiểu.

Cấp độ 4: Sử dụng các công cụ phân tích dấu vết như Perfetto 

Các công cụ phân tích dấu vết như Perfetto được dùng khi bạn cần xem xét ngoài mã xử lý ứng dụng của riêng mình. Không giống như các trình gỡ lỗi hoặc trình phân tích tiêu chuẩn chỉ xem quy trình của bạn, Perfetto ghi lại toàn bộ trạng thái thiết bị (lập lịch nhân, tần số CPU, các quy trình khác và dịch vụ hệ thống), giúp bạn có được bối cảnh đầy đủ về các vấn đề hiệu suất.

Hãy xem danh sách phát Gỡ lỗi hiệu suất trên YouTube để xem hướng dẫn bằng video về cách gỡ lỗi hiệu suất bằng cách sử dụng dấu vết hệ thống, Trình phân tích tài nguyên của Android Studio và Perfetto.

Cách sử dụng Perfetto để gỡ lỗi hiệu suất

Quy trình làm việc chung để gỡ lỗi hiệu suất bằng các công cụ phân tích dấu vết là ghi lại, tải và phân tích dấu vết. 

Bước 1: Ghi lại dấu vết

Bạn có thể ghi lại dấu vết hệ thống bằng một số phương pháp: 

Bước 2: Tải dấu vết

Sau khi có tệp theo dõi, bạn cần tải tệp đó vào công cụ phân tích.

  1. Mở Chrome rồi chuyển đến ui.perfetto.dev.
  2. Kéo và thả tệp .perfetto-trace (hoặc .pftrace) trực tiếp vào cửa sổ trình duyệt.
  3. Giao diện người dùng sẽ xử lý tệp và hiển thị dòng thời gian.

Bước 3: Phân tích dấu vết

Bạn có thể sử dụng giao diện người dùng Perfetto hoặc Trình phân tích tài nguyên trong Android Studio để kiểm tra các vấn đề về hiệu suất. Hãy xem tập này trong loạt video về Kỹ năng MAD (Phát triển Android hiện đại) về Hiệu suất, nơi kỹ sư hiệu suất Carmen Jackson của chúng tôi thảo luận về Perfetto traceviewer.

Các trường hợp kiểm tra dấu vết hệ thống bằng Perfetto

Perfetto là một công cụ chuyên dụng và có thể cung cấp thông tin về mọi hoạt động diễn ra trên thiết bị Android trong khi một dấu vết được ghi lại. Điều này đặc biệt hữu ích khi bạn không thể xác định nguyên nhân gốc rễ của tình trạng chậm bằng cách sử dụng nhật ký tiêu chuẩn hoặc trình phân tích cơ bản.

Gỡ lỗi hiện tượng giật (rớt khung hình)

Nếu ứng dụng của bạn bị giật khi cuộn, Perfetto có thể cho bạn biết chính xác lý do một khung hình cụ thể bị lỡ thời hạn.

Nếu nguyên nhân là do ứng dụng, thì có thể bạn sẽ thấy luồng chính chạy trong thời gian dài để phân tích cú pháp nặng; điều này cho thấy những trường hợp mà bạn nên chuyển công việc sang quy trình xử lý không đồng bộ.

Nếu nguyên nhân là do hệ thống, bạn có thể thấy luồng chính đã sẵn sàng chạy, nhưng trình lập lịch nhân CPU đã ưu tiên một dịch vụ hệ thống khác, khiến ứng dụng của bạn phải chờ (tranh chấp CPU). Điều này cho biết những trường hợp mà bạn có thể cần tối ưu hoá việc sử dụng các API nền tảng.

Phân tích quá trình khởi động ứng dụng chậm

Quá trình khởi động rất phức tạp, bao gồm khởi động hệ thống, phân nhánh quy trình và tải tài nguyên. Perfetto trực quan hoá dòng thời gian này một cách chính xác.

Bạn có thể biết liệu mình có đang chờ các lệnh gọi Binder (giao tiếp giữa các quy trình) hay không. Nếu onCreate của bạn chờ quá lâu để nhận được phản hồi từ PackageManager của hệ thống, Perfetto sẽ cho thấy rõ trạng thái bị chặn đó. 

Bạn cũng có thể xem liệu ứng dụng của mình có đang thực hiện nhiều việc hơn mức cần thiết trong quá trình khởi động ứng dụng hay không. Ví dụ: nếu đang tạo và bố trí nhiều khung hiển thị hơn mức cần thiết để ứng dụng hiển thị, bạn có thể thấy những thao tác này trong dấu vết.

Điều tra tình trạng tiêu hao pin và mức sử dụng CPU

Vì Perfetto có thể thấy toàn bộ hệ thống, nên đây là công cụ lý tưởng để tìm ra những mức tiêu thụ điện năng không nhìn thấy được.

Bạn có thể xác định những quy trình đang giữ khoá đánh thức, ngăn thiết bị chuyển sang chế độ ngủ trong các bản theo dõi "Trạng thái thiết bị". Tìm hiểu thêm trong bài đăng trên blog về khoá đánh thức. Ngoài ra, hãy sử dụng Perfetto để xem các tác vụ trong nền có đang chạy quá thường xuyên hay đánh thức CPU một cách không cần thiết hay không.

Cấp độ 5: Xây dựng khung theo dõi hiệu suất của riêng bạn

Cấp độ cuối cùng là dành cho những ứng dụng có đội ngũ đủ nguồn lực để duy trì một khung theo dõi hiệu suất. 

Việc tạo một khung theo dõi hiệu suất tuỳ chỉnh trên Android liên quan đến việc tận dụng một số API hệ thống để thu thập dữ liệu trong suốt vòng đời ứng dụng, từ khi khởi động đến khi thoát và trong các trường hợp cụ thể có tải cao.

Bằng cách sử dụng ApplicationStartInfo, ProfilingManagerApplicationExitInfo, bạn có thể tạo một hệ thống đo từ xa mạnh mẽ để báo cáo về cách ứng dụng của bạn khởi động, thông tin chi tiết về những gì ứng dụng đã làm trong khi chạy và lý do ứng dụng bị dừng.

ApplicationStartInfo: Theo dõi cách ứng dụng khởi động

Có từ Android 15 (API 35), ApplicationStartInfo cung cấp các chỉ số chi tiết về quá trình khởi động ứng dụng trên thực tế. Dữ liệu này bao gồm cả việc đó là khởi động nguội, khởi động ấm hay khởi động nóng, cũng như thời lượng của các giai đoạn khởi động khác nhau. 

Điều này giúp bạn phát triển chỉ số khởi động cơ sở bằng dữ liệu sản xuất để tối ưu hoá thêm những chỉ số có thể khó tái tạo cục bộ. Bạn có thể sử dụng các chỉ số này để chạy thử nghiệm A/B nhằm tối ưu hoá quy trình khởi động.

Mục tiêu là ghi lại chính xác các chỉ số khởi chạy mà không cần đo lường thủ công mọi giai đoạn khởi chạy.

Bạn có thể truy vấn dữ liệu này một cách trì hoãn sau khi khởi chạy ứng dụng.

ProfilingManager: Ghi lại lý do khiến quá trình này diễn ra chậm

ProfilingManager (API 35) cho phép ứng dụng của bạn kích hoạt theo dõi hệ thống theo cách lập trình trên thiết bị của người dùng. Điều này rất hữu ích khi bạn muốn phát hiện các vấn đề về hiệu suất tạm thời mà bạn không thể tái tạo cục bộ.

Mục tiêu là tự động ghi lại dấu vết khi một hành trình trọng yếu cụ thể của người dùng được phát hiện là đang chạy chậm hoặc gặp phải các vấn đề về hiệu suất.

Bạn có thể đăng ký một trình nghe kích hoạt khi đáp ứng các điều kiện cụ thể hoặc kích hoạt trình nghe theo cách thủ công khi phát hiện thấy vấn đề về hiệu suất, chẳng hạn như hiện tượng giật, sử dụng quá nhiều bộ nhớ hoặc tiêu hao pin.

Hãy xem tài liệu của chúng tôi về cách ghi lại một hồ sơtruy xuất và phân tích dữ liệu lập hồ sơ và sử dụng các lệnh gỡ lỗi.

ApplicationExitInfo: Theo dõi lý do ứng dụng bị lỗi

ApplicationExitInfo (API 30) cho bạn biết lý do quy trình trước đó của bạn bị chấm dứt. Điều này rất quan trọng để tìm ra các sự cố gốc, lỗi ANR hoặc hệ thống bị tắt do sử dụng quá nhiều bộ nhớ (OOM). Bạn cũng có thể nhận được dấu vết chi tiết về sự cố bằng cách sử dụng API getTraceInputStream.

Mục tiêu của API này là tìm hiểu các vấn đề về độ ổn định không kích hoạt trình báo cáo sự cố Java tiêu chuẩn (chẳng hạn như Low Memory Kills).

Bạn nên kích hoạt API này khi khởi chạy ứng dụng vào lần tiếp theo.

Các bước tiếp theo

Cải thiện hiệu suất Android là một hành trình từng bước. Chúng tôi rất mong được thấy cách bạn nâng cao hiệu suất bằng những công cụ này!

Đừng quên theo dõi Ask Android vào ngày mai

Bạn đã rút gọn ứng dụng bằng R8 và tối ưu hoá thời gian chạy bằng tính năng Tối ưu hoá theo hướng dẫn của hồ sơ. Đồng thời đo lường hiệu suất của ứng dụng.

Hãy tham gia buổi Hỏi về Android trực tiếp vào ngày mai. Hãy đặt câu hỏi ngay bây giờ bằng hashtag #AskAndroid để các chuyên gia giải đáp cho bạn.

Tác giả:

Tiếp tục đọc