Tl; dr
Có thể với root, bạn có thể điều chỉnh oom_adj
các giá trị để ngăn không cho ứng dụng bị giết, thay vào đó, buộc ứng dụng đích phải ở trong bộ nhớ bằng cách "khóa" nó hoặc thay đổi một số cài đặt liên quan chịu trách nhiệm cho việc tắt ứng dụng trong điều kiện bộ nhớ thấp.
Bối cảnh: Quản lý RAM Android
Android sử dụng một cách xử lý khác nhau. Thay vì giết mọi tiến trình sau khi hoạt động của nó kết thúc, các tiến trình được giữ cho đến khi hệ thống cần thêm bộ nhớ. Ý tưởng là để cải thiện tốc độ nếu bạn bắt đầu lại hoạt động đó. Nhưng làm thế nào / khi nào Android giết một tiến trình nếu nó cần thêm bộ nhớ và tiến trình nào sẽ giết trước?
Điều này được quản lý bởi trình điều khiển LMK (Low Memory Killer) của Android. Bạn có thể đã biết rằng mọi ứng dụng / quy trình trong Android đều được gán một
oom_adj
giá trị, điều này cho thấy khả năng nó bị giết khi xảy ra tình trạng hết bộ nhớ (OOM). Giá trị của nó càng cao thì khả năng bị giết càng cao. Phạm vi hợp lệ là -17
đến +15
. (nếu trong -17
phạm vi có nghĩa là nó sẽ không bị giết). Theo đó, có sáu nhóm (nhóm OOM), trong đó các ứng dụng / quy trình được phân loại:
- Ứng dụng tiền cảnh
- Ứng dụng hữu hình
- Máy chủ thứ cấp
- Ứng dụng ẩn
- Nhà cung cấp nội dung
- Ứng dụng trống
Về cơ bản chúng có thể được mô tả như sau:
FOREGROUND_APP
: Đây là quá trình chạy ứng dụng tiền cảnh hiện tại. Chúng tôi thực sự không muốn giết nó!
VISIBLE_APP
: Đây là một quá trình chỉ lưu trữ các hoạt động hiển thị cho người dùng, vì vậy chúng tôi muốn chúng không biến mất.
SECONDARY_SERVER
: Đây là một quá trình giữ một máy chủ thứ cấp - giết chết nó sẽ không ảnh hưởng nhiều đến người dùng.
HIDDEN_APP
: Đây là một quá trình chỉ lưu trữ các hoạt động không thể nhìn thấy, vì vậy nó có thể bị giết mà không bị gián đoạn.
CONTENT_PROVIDER
: Đây là một quy trình với nhà cung cấp nội dung không có bất kỳ khách hàng nào được đính kèm. Nếu nó có bất kỳ máy khách nào, sự điều chỉnh của nó sẽ là ưu tiên cao nhất của các quy trình đó.
EMPTY_APP
: Đây là một quá trình không có gì hiện đang chạy trong đó. Chắc chắn là người đầu tiên đi.
Các nhóm này được xác định bởi các oom_adj
giới hạn giá trị và các ứng dụng sẽ thuộc một trong các nhóm đó theo oom_adj
giá trị được gán cho ứng dụng cụ thể đó. "Ứng dụng tiền cảnh" thường có oom_adj
giá trị bằng 0
hoặc ít hơn (vì vậy chúng ít bị giết nhất; nghĩa là mức độ ưu tiên cao).
"Ứng dụng trống" có mức cao hơn oom_adj
(chúng bị giết sớm; nghĩa là mức độ ưu tiên thấp). Ngoài ra, oom_adj
giá trị thay đổi theo trạng thái của ứng dụng người dùng; đó là 0
khi ứng dụng hoạt động ở nền trước và được gán giá trị cao hơn khi ứng dụng đi vào nền.
Tại sao "khả năng giết người" của họ khác nhau? Các ứng dụng thuộc các nhóm khác nhau này (có khác nhau oom_adj's
), bắt đầu bị giết ở các mức RAM miễn phí khác nhau. Các giới hạn RAM kích hoạt này được xác định bởi các giá trị minfree LMK. Trên 6 loại tương ứng với 6 giới hạn RAM được đặt trong minfree LMK. ví dụ: Stock Android 4.3 trong thiết bị của tôi đi kèm với các giá trị minfree của 48,60,72,84,96,120
. (những cái này tính bằng MB).
Thực tế ý nghĩa của nó là, các ứng dụng trống sẽ bị giết khi ram xuống dưới 120mb, Các nhà cung cấp nội dung khi nó xuống dưới 96mb, Các ứng dụng ẩn khi nó xuống dưới 84mb và cứ thế .. cuối cùng bắt đầu giết các ứng dụng Foreground khi ram xuống dưới 48mb. (Bạn có thể nhận thấy rằng giá trị cuối cùng này (48mb) là không mong muốn khi sử dụng các ứng dụng cần nhiều bộ nhớ như các trò chơi nặng).
Lưu ý:
Trong kernel mới hơn, oom_ score _adj
được sử dụng thay vì cũ oom_adj
. (oom_score_adj phạm vi hợp lệ là -1000 đến 1000). Nhưng oom_adj
cũng được duy trì cho khả năng tương thích.
Người ta nói rằng có nhiều loại quy trình OOM được chỉ định các mức độ oom_adj
ưu tiên khác nhau ActivityManagerService
, nhưng cuối cùng tất cả các loại đó sẽ được xem xét dưới sáu vị trí / nhóm trên (theo oom_limits), với mục đích tiêu diệt các trình kích hoạt miễn phí LMK. Do đó, sáu người đó là những người quan trọng đối với người dùng bình thường.
- Chúng tôi có thể kiểm tra các giá trị minfree (cũng thay đổi chúng) và xem các nhóm ứng dụng / quy trình OOM với ứng dụng Trình quản lý bộ nhớ này một cách dễ dàng.
Không phải mọi thiết bị đều có cấu hình OOM giống nhau.
Cải thiện quản lý RAM
Ngày nay, có rất nhiều cơ chế quản lý RAM thân thiện với người dùng trong cài đặt hệ thống (như tối ưu hóa ứng dụng trong cài đặt Pin, ứng dụng được bảo vệ trong một số ROM, ví dụ EMUI của Huawei, v.v.) và có thể có tác dụng tương tự như mô tả ở trên:
Phải nói rằng bây giờ chúng ta có thể khám phá những cách thức, RAM có thể được sử dụng mà không cần phải giết các ứng dụng tiền cảnh quá thường xuyên. Các khu vực mục tiêu sẽ bao gồm:
1. Điều chỉnh các giá trị minifree phù hợp với nhu cầu của một người
2.Lập các ứng dụng trong bộ nhớ để ngăn chặn chúng bị giết
3.Overridding giới hạn ứng dụng ẩn của Android
Điều chỉnh giá trị minifree
Bạn có thể thay đổi các giá trị minfree bằng trình quản lý bộ nhớ và nhấn áp dụng. (Ngoài ra, còn có một tùy chọn áp dụng tại ứng dụng khởi động và đánh dấu để duy trì cài đặt trên các khởi động). Một số ứng dụng có thể đạt được điều này, ví dụ như Trình quản lý bộ nhớ , Trình quản lý Minfree , v.v.
Hoặc sử dụng terminal / adb bằng các trang:
#!/system/bin/sh echo “values” > /sys/module
Khóa ứng dụng để lưu trong bộ nhớ (làm cho nó cư trú)
a) Sử dụng Cài đặt ứng dụng (Xposed)
- Một phương pháp đơn giản được sử dụng mô-đun Xposed, cài đặt ứng dụng (bạn cần cài đặt khung Xposed )
- Sau khi cài đặt khung, sau đó tải xuống mô-đun 'Cài đặt ứng dụng' thông qua trình cài đặt Xposed.
- Mở Cài đặt ứng dụng và cho phép các ứng dụng tải, chọn ứng dụng đích (trong trường hợp này là trình duyệt firefox )
- Trong trang cài đặt, bật chức năng bật tắt và kích hoạt chế độ chỉnh sửa, đánh dấu vào tùy chọn Residentiên và lưu. ( Làm các ứng dụng thường trú, gây ra các ứng dụng để ở bộ nhớ mà không bị thiệt mạng và nó được khuyên nên sử dụng nút exit trong ứng dụng đích nếu nó không còn cần thiết nếu không nó sẽ mất bộ nhớ ứng dụng khác)
b) Sử dụng khóa bộ nhớ
Một cách thực hiện khác của khái niệm này là khóa ứng dụng đích trong bộ nhớ bằng cách kiểm soát các tệp hệ thống để cài đặt oom_adj
cho tất cả các quy trình đang chạy.
Cách thức hoạt động của ứng dụng:
Bộ nhớ khóa điều khiển các tệp trong thư mục / data và cũng kiểm soát các tệp sytem trong root để đặt oom_adj cho các tiến trình đang chạy.
Tất cả các ứng dụng bị khóa sẽ tự động bị khóa sau mỗi lần khởi động lại. Ứng dụng được phân loại là ứng dụng được tải xuống / hệ thống, để mở khóa chọn ứng dụng đích và nhấp vào khóa ở bên phải. (Bạn có thể tùy chọn đặt oom_adj
mức độ ưu tiên)
Ghi đè giới hạn ứng dụng ẩn
Ngoài cơ chế giết bộ nhớ thấp, còn có một tham số khác kiểm soát việc giết các ứng dụng bị ẩn và trống. Ứng dụng bị giết khi chúng vượt quá giới hạn quy định.
Có một cài đặt build.prop có thể kiểm soát điều này (mặc định thường là số thấp dưới 25 và sửa đổi điều này có thể tăng giá trị này lên giá trị lớn hơn nhiều như 80)
Thêm dòng này vào tệp build.prop trong / system và để lại một dòng trống bên dưới (chắc chắn sẽ sao lưu trước)
ro.sys.fw.bg_apps_limit=80
Tài liệu tham khảo và tín dụng
- Quản lý RAM Android (Tín dụng đặc biệt: mrhnet )
- Bộ nhớ khóa
- Xposed - Thông tin chung, phiên bản & thay đổi