Trình tắt ứng dụng khi bộ nhớ thấp

Trình nền tắt ứng dụng khi bộ nhớ thấp (LMK) của Android giám sát trạng thái bộ nhớ của hệ thống Android đang chạy và phản ứng với áp lực bộ nhớ cao bằng cách chấm dứt các quy trình ít thiết yếu nhất. Android vitals theo dõi và báo cáo các trường hợp chấm dứt do LMK mà người dùng nhận thấy trong Google Play Console để giúp bạn xác định các vấn đề về áp lực bộ nhớ ảnh hưởng đến người dùng.

Chỉ số LMK trên Android vitals

Android vitals có thể giúp bạn theo dõi và cải thiện tỷ lệ LMK của ứng dụng. Android vitals chỉ đo lường một tỷ lệ LMK: Tỷ lệ LMK mà người dùng nhận thấy.

Chỉ số này phản ánh tỷ 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 LMK mà người dùng nhận thấy. Lỗi LMK mà người dùng nhận thấy là lỗi LMK mà có thể người dùng đã chú ý đến. Ví dụ: chỉ số này bao gồm cả các lỗi LMK xảy ra trong khi ứng dụng của bạn cho thấy một hoạt động hoặc chạy dưới dạng một dịch vụ nền trước. Những lần chấm dứt này dẫn đến việc thoát quy trình ngay lập tức và không bình thường. Đối với người dùng cuối, có vẻ như ứng dụng đã gặp sự cố, thường bỏ qua các cơ chế lưu trạng thái vòng đời tiêu chuẩn và dẫn đến mất tiến trình của người dùng.

Android vitals tập trung vào các trường hợp chấm dứt quy trình này vì chúng đóng vai trò là proxy có độ chính xác cao cho các vấn đề quản lý bộ nhớ không đúng cách. Tỷ lệ LMK trên 1% cho thấy bạn cần phải hành động ngay lập tức. Tuy nhiên, tỷ lệ LMK thấp hơn không nhất thiết có nghĩa là mức sử dụng bộ nhớ của ứng dụng ở trạng thái tốt. Tỷ lệ thấp hơn đó có thể có nghĩa là trình nền LMK thường xuyên loại bỏ các quy trình khi chúng đang ở chế độ nền, làm giảm hiệu suất "khởi động ấm" và tính linh hoạt khi đa nhiệm.

Bạn có thể tìm thấy chỉ số này trong phần Tính ổn định của Android vitals:

Hình 1. Truy cập vào Tỷ lệ lỗi LMK mà người dùng nhận thấy trong Android vitals.

Giống như các chỉ số quan trọng chính tương tự (chẳng hạn như lỗi ANR và sự cố), bạn có thể lọc các chỉ số, so sánh chỉ số của mình với các ứng dụng ngang hàng hoặc theo dõi sự thay đổi của chỉ số trong một khoảng thời gian dài (tối đa 3 năm). Dữ liệu có sẵn cho các ứng dụng hiện có từ ngày 28 tháng 1 năm 2025.

Hình 2. Tổng quan về tỷ lệ lỗi LMK trong Android vitals.

Cách hoạt động của trình nền tắt ứng dụng khi bộ nhớ thấp

Nền tảng Android hoạt động trên cơ sở bộ nhớ trống là bộ nhớ bị lãng phí. Android luôn cố gắng sử dụng tất cả bộ nhớ có sẵn. Ví dụ: sau khi các ứng dụng đã đóng, hệ thống sẽ vẫn lưu giữ chúng trong bộ nhớ để người dùng có thể nhanh chóng chuyển về ứng dụng khi được mở lại. Vì lý do này, các thiết bị Android thường chạy với rất ít bộ nhớ trống (xem phần Phân bổ bộ nhớ giữa các quy trình).

Để quyết định cần loại bỏ quy trình nào khi bộ nhớ trống sắp hết, trình nền low memory killer (LMK) sẽ sử dụng điểm hết bộ nhớ được gọi là oom_adj_score để ưu tiên các quy trình đang chạy. Những quy trình có điểm cao sẽ bị loại bỏ trước. Ứng dụng nền sẽ bị loại bỏ đầu tiên; quy trình hệ thống sẽ bị loại bỏ sau cùng. Bảng dưới đây liệt kê các danh mục có điểm LMK từ cao đến thấp. Các mục trong danh mục có điểm số cao nhất ở hàng một sẽ bị xoá trước:

Các quy trình của Android được xếp hạng từ điểm cao nhất đến thấp nhất: Ứng dụng nền, ứng dụng trước, ứng dụng Home, dịch vụ, ứng dụng có thể nhận biết, ứng dụng trên nền trước, ứng dụng cố định, ứng dụng hệ thống và ứng dụng gốc.
Hình 3. Các quy trình của Android, với điểm cao ở trên cùng và điểm thấp ở dưới cùng.

Công cụ phân tích bộ nhớ

Các công cụ sau đây có thể giúp bạn tìm và chẩn đoán các vấn đề về bộ nhớ theo những cách sau:

  • Xem cách ứng dụng của bạn phân bổ bộ nhớ theo thời gian. Bạn có thể xem biểu đồ theo thời gian thực về mức sử dụng bộ nhớ của ứng dụng, số lượng đối tượng Java được phân bổ và thời điểm thu gom rác.
  • Hãy bắt đầu các sự kiện thu thập rác và chụp nhanh vùng nhớ khối xếp Java trong khi ứng dụng của bạn chạy.
  • Ghi lại quy trình phân bổ bộ nhớ của ứng dụng, kiểm tra tất cả đối tượng được phân bổ và xem dấu vết ngăn xếp của từng lượt phân bổ.

Nếu trò chơi của bạn đang chạy trên một công cụ gốc, hãy sử dụng HWAddress Sanitizer để gỡ lỗi phân bổ bộ nhớ gốc.

Trình phân tích bộ nhớ trong Android Studio

Android Studio cung cấp Trình phân tích bộ nhớ dưới dạng một thành phần của Trình phân tích tài nguyên Android, giúp bạn xác định tình trạng rò rỉ bộ nhớ và tình trạng nhồi nhét bộ nhớ có thể khiến ứng dụng bị gián đoạn, bị treo và thậm chí gặp sự cố. Trình phân tích này cho bạn thấy biểu đồ theo thời gian thực về mức sử dụng bộ nhớ của ứng dụng, đồng thời cho phép bạn ghi lại tệp báo lỗi, buộc thu thập rác và theo dõi hoạt động phân bổ bộ nhớ.

Trình phân tích bộ nhớ của Android Studio cho thấy các tham chiếu JNI chung trong vùng nhớ khối xếp.
Hình 4. Xem các lượt tham chiếu JNI toàn cục trong Trình phân tích bộ nhớ của Android Studio.

Công cụ phân tích bộ nhớ của Unity

Nếu đang sử dụng Unity Engine để xây dựng ứng dụng, bạn có thể làm theo hướng dẫn phân tích bộ nhớ của Unity. Unity cung cấp hai công cụ để phân tích mức sử dụng bộ nhớ trong ứng dụng của bạn trong Unity.

Đầu tiên là mô-đun Trình phân tích bộ nhớ, một trình phân tích tích hợp sẵn cung cấp cho bạn thông tin cơ bản về nơi ứng dụng sử dụng bộ nhớ.

Mô-đun bộ nhớ cho thấy mức phân bổ bộ nhớ, chẳng hạn như bộ nhớ kết cấu và bộ nhớ lưới.
Hình 5. Cửa sổ Trình phân tích tài nguyên Unity khi chọn mô-đun Memory (Bộ nhớ).

Công cụ thứ hai là gói Trình phân tích bộ nhớ, một gói Unity mà bạn có thể thêm vào dự án của mình. Gói này thêm một cửa sổ Trình phân tích bộ nhớ bổ sung vào Trình chỉnh sửa Unity. Trình phân tích bộ nhớ cho phép bạn phân tích mức sử dụng bộ nhớ trong ứng dụng một cách chi tiết hơn. Bạn có thể lưu trữ và so sánh ảnh chụp nhanh để tìm lỗi rò rỉ bộ nhớ hoặc xem bố cục bộ nhớ để tìm vấn đề phân mảnh bộ nhớ.

Cửa sổ Trình phân tích bộ nhớ Unity cho thấy thông tin chi tiết về ảnh chụp nhanh bộ nhớ.
Hình 6. Phân tích ảnh chụp nhanh bộ nhớ bằng cửa sổ Trình phân tích bộ nhớ.

Để biết quy trình làm việc của Unity dành riêng cho Android, hãy xem các bài viết Kiểm tra mức sử dụng bộ nhớ bằng các công cụ của Unity, Tối ưu hoá mức sử dụng bộ nhớ trong Unity và Gỡ lỗi LMK cho trò chơi Unity.

Unreal Memory Insights

Các ứng dụng được xây dựng bằng Unreal Engine có thể sử dụng Unreal Memory Insights để xem thông tin chi tiết về việc phân bổ bộ nhớ và giải phóng bộ nhớ, bao gồm cả thẻ Bộ nhớ cấp thấp (LLM) và ngăn xếp lệnh gọi liên kết với các khối bộ nhớ.

Hệ thống truy vấn Thông tin chi tiết về bộ nhớ có thể tìm thấy các lượt phân bổ đang hoạt động tại bất kỳ thời điểm nào, xác định các thay đổi về mức sử dụng bộ nhớ, xác định vị trí rò rỉ bộ nhớ và phân biệt các lượt phân bổ ngắn hạn với dài hạn.

Kể từ UE 5.4, Memory Insights hỗ trợ tính năng theo dõi bộ nhớ bằng ngăn xếp lệnh gọi cho các dự án Android.

Trình theo dõi Thông tin chi tiết về bộ nhớ cho thấy biểu đồ bộ nhớ chính, số lượt phân bổ trực tiếp và số lượng sự kiện phân bổ/giải phóng.
Hình 7. Trình theo dõi Thông tin chi tiết về bộ nhớ của Unreal.

Để biết quy trình làm việc của Unreal dành riêng cho Android, hãy xem bài viết Kiểm tra mức sử dụng bộ nhớ bằng Unreal và Tối ưu hoá mức sử dụng bộ nhớ trong Unreal.

Thông tin chi tiết về tình trạng bộ nhớ thấp

Android cung cấp các lệnh gọi lại và API cho phép bạn giảm mức sử dụng bộ nhớ của trò chơi, đồng thời xác định lý do khiến các lần chạy trò chơi trước đó bị chấm dứt.

Lệnh gọi lại

Đừng đăng ký các lệnh gọi lại trim không dùng nữa. Android không cung cấp API để phát hiện các sự kiện áp lực bộ nhớ gốc trước khi hệ thống thu hồi bộ nhớ, và các lệnh gọi lại cắt bớt bộ nhớ đang chạy chi tiết (TRIM_MEMORY_RUNNING_*) không hiệu quả trong việc ngăn chặn tình trạng tắt ứng dụng do bộ nhớ thấp. Do đó, Android đã ngừng sử dụng tất cả các cấp độ cắt bớt ngoài TRIM_MEMORY_UI_HIDDEN và TRIM_MEMORY_BACKGROUND. Sử dụng các lệnh gọi lại còn lại này (hoặc các lệnh gọi lại tương đương trong vòng đời của công cụ, chẳng hạn như OnApplicationPause của Unity và ApplicationWillEnterBackgroundDelegate của Unreal) để giải phóng giao diện người dùng và tài nguyên phụ trợ khi trò chơi của bạn chuyển sang chế độ nền. Để biết thông tin chi tiết về cách triển khai, hãy xem bài viết Giảm mức sử dụng bộ nhớ trong trò chơi.

Chấm dứt trò chơi

Android cố gắng sử dụng tất cả bộ nhớ có sẵn để lưu ứng dụng và trò chơi vào bộ nhớ đệm nhằm đảm bảo các ứng dụng và trò chơi đó tải nhanh (cải thiện trải nghiệm người dùng). Tuy nhiên, khi bộ nhớ bị hạn chế, hệ thống sẽ tắt các ứng dụng và trò chơi tốn nhiều bộ nhớ nhất để giải phóng bộ nhớ cho hoạt động bình thường của thiết bị.

Thông tin, thông tin chi tiết và các phương pháp hay nhất để giúp bạn đạt được mức sử dụng bộ nhớ trò chơi tốt hơn bao gồm:

  • Sử dụng ApplicationExitInfo: API này trả về lý do hệ thống Android tắt lần chạy trò chơi trước đó. Sử dụng ApplicationExitInfo để kiểm tra xem có phải bộ nhớ sắp hết (REASON_LOW_MEMORY) hoặc việc chấm dứt do giới hạn bộ nhớ (REASON_MEMORY_LIMITER) là lý do khiến một quy trình trước đó bị thoát hay không (xem ApplicationExitInfo cho trò chơi). Kiểm tra xem trò chơi có bị chấm dứt do áp lực bộ nhớ hay không để có thể tối ưu hoá trò chơi nhằm sử dụng ít bộ nhớ hơn trên thiết bị đó.
  • Xem tổng RAM vật lý: Để ngăn trò chơi bị tắt khi đang chạy ở nền trước và để phù hợp với khả năng của thiết bị, hãy xem tổng RAM vật lý trên mỗi thiết bị để biết mức độ chi tiết nhằm điều chỉnh mức sử dụng bộ nhớ của trò chơi dựa trên thông tin đó. Nếu mục tiêu là ngăn ứng dụng bị tắt ngay sau khi chuyển sang chế độ nền (để cho phép người chơi thực hiện đa nhiệm), hãy sử dụng lệnh gọi lại trim (cụ thể là TRIM_MEMORY_UI_HIDDEN) để giảm mức sử dụng bộ nhớ của trò chơi.

Tài nguyên khác