Bộ nhớ là một tài nguyên quan trọng và có hạn trên các thiết bị chạy Android. Là nhà phát triển nền tảng Android hoặc OEM, việc hiểu rõ cách hoạt động của bộ nhớ ở mọi cấp độ (từ thời gian chạy Java đến nhân Linux) là điều cần thiết để xây dựng một hệ thống ổn định và hiệu quả.
Hướng dẫn này cung cấp thông tin tổng quan toàn diện về cấu trúc bộ nhớ Android, các công cụ có sẵn để phân tích và các bài tập thực hành giúp bạn xác định và giải quyết các vấn đề liên quan đến bộ nhớ.
Mục tiêu
Sau khi hoàn thành hướng dẫn này, bạn sẽ có thể:
- Giải thích các khái niệm cơ bản về bộ nhớ Android, bao gồm cả mô hình quy trình Zygote và tệp được liên kết với bộ nhớ.
- Phân biệt giữa Kích thước cài đặt thường trú (RSS), Kích thước cài đặt theo tỷ lệ (PSS) và Kích thước cài đặt riêng biệt (USS).
- Sử dụng các công cụ dòng lệnh tiêu chuẩn như
dumpsys meminfovàshowmapđể nhanh chóng đánh giá mức sử dụng bộ nhớ. - Ghi lại và phân tích tệp báo lỗi Java bằng AHAT để tìm lỗi rò rỉ và phân bổ quá mức.
- Sử dụng Perfetto và
heapprofdđể lập hồ sơ cả bộ nhớ Java và bộ nhớ gốc trên toàn bộ hệ thống. - Tìm hiểu các chỉ báo áp lực bộ nhớ trên toàn hệ thống như Thông tin về tình trạng tắc nghẽn do áp lực (PSI) và theo dõi hoạt động của Trình tắt ứng dụng khi bộ nhớ thấp (LMK).
- Quan sát hoạt động thu hồi ở cấp nhân, bao gồm cả việc hoán đổi ZRAM và loại bỏ bộ nhớ đệm trang.
Cấu trúc hướng dẫn
Hướng dẫn này được sắp xếp thành các phần sau, được thiết kế để đọc theo trình tự:
- Khái niệm cơ bản: Các nguyên tắc kỹ thuật cốt lõi của bộ nhớ Android.
- Công cụ đánh giá nhanh: Sử dụng
meminfo,showmapvàprocstatsđể phân loại nhanh. - Phân tích bộ nhớ Java: Tìm hiểu sâu về vùng nhớ khối xếp Java bằng AHAT.
- Bitmap và bộ nhớ: Tìm hiểu mức độ ảnh hưởng của hình ảnh đến RAM và sử dụng các công cụ để phân tích hình ảnh.
- Phân tích bộ nhớ gốc: Phân tích bộ nhớ C/C++ bằng Perfetto và
heapprofd. - WebView và bộ nhớ: Tìm hiểu về cấu trúc đa quy trình và mức sử dụng bộ nhớ của WebView.
- Mã ứng dụng là bộ nhớ: Tìm hiểu cách tải lớp và tác động của dex bloat đến RAM.
- Luồng và bộ nhớ: Phân tích chi phí của ngăn xếp luồng gốc.
- Vị trí bộ nhớ và hiệu suất: Tìm hiểu cách các mẫu truy cập dữ liệu ảnh hưởng đến hiệu suất của CPU.
- Liên kết dịch vụ và trạng thái quy trình: Tìm hiểu cách các phần phụ thuộc giữa các quy trình ảnh hưởng đến điểm OOM.
- Khắc phục sự cố trên toàn hệ thống: Theo dõi PSI, LMK, hoán đổi ZRAM và loại bỏ bộ nhớ đệm trang.
- Thu hồi bộ nhớ: loại bỏ và hoán đổi: Tìm hiểu về memcg,
tính phí và chủ động thu hồi bằng
memory.reclaim. - Tương tác giữa kswapd và lmkd: Tìm hiểu cách kswapd và lmkd hoạt động cùng nhau khi chịu áp lực.
- Trả lại các trang bộ nhớ cho hệ điều hành: Sử dụng
madvisevàposix_fadviseđể trả lại các trang vùng nhớ khối xếp và trang bộ nhớ đệm tệp không dùng đến cho nhân hệ điều hành. - Duy trì hoạt động trong nền bằng một quy trình tinh gọn: Di chuyển các dịch vụ nền và worker vào một quy trình chuyên biệt để giao diện người dùng và bộ nhớ đồ hoạ không được giữ ở mức ưu tiên cao.
Điều kiện tiên quyết và môi trường
Hướng dẫn này trình bày quy trình làm việc tham khảo, dữ liệu điểm chuẩn và nghiên cứu điển hình minh hoạ cách chẩn đoán và giải quyết các vấn đề về bộ nhớ Android.
- Công cụ phân tích: Các kỹ thuật trong hướng dẫn này chủ yếu sử dụng các công cụ hiệu suất Android tiêu chuẩn, bao gồm Perfetto,
dumpsys meminfo,showmapvà AHAT. - Đặc quyền gốc: Một số quy trình chẩn đoán ở cấp hệ thống (chẳng hạn như kiểm tra áp lực bộ nhớ hạt nhân hoặc bộ đếm PMU phần cứng) yêu cầu đặc quyền gốc nâng cao (
adb root) trên bản dựng trình mô phỏng hoặc thiết bị userdebug.
Bắt đầu tại đây: Các khái niệm cơ bản