Có cách nào (với root không?) Để ngăn kẻ giết nhiệm vụ Android giết một số ứng dụng nhất định?


7

Tôi muốn một ứng dụng trình duyệt (FireFox) không bị giết bởi kẻ giết nhiệm vụ của hệ thống vì tôi muốn sử dụng một số ứng dụng trang duy nhất chứa một số dữ liệu và không được tải rất nhanh. Có cách nào để đối phó với điều này, ngay cả khi root là bắt buộc?

Cách đây một thời gian, tôi đã cập nhật thiết bị của mình từ RAM 1 GB sang RAM khác, RAM 3 GB và mọi thứ đều ổn (trình duyệt đã dừng để bị giết). Nhưng sau khi cập nhật hệ thống vào tháng 1 năm 2016, mọi thứ thậm chí còn tồi tệ hơn, bây giờ FireFox thường bị giết ngay cả khi đồng hồ báo thức reo hoặc tôi mở một ứng dụng camera. Đây là một vấn đề lớn đối với tôi vì vậy tôi đánh giá cao bất kỳ sự giúp đỡ nào về việc này.

Cuối cùng, tôi đã thử Cài đặt → Pin → Tối ưu hóa pin trong đó cả hai tôi đã thêm FF vào các trường hợp ngoại lệ (không trợ giúp) và đã bật Tối ưu hóa pin (cũng không giúp được gì).

Câu trả lời:


8

Tl; dr

Có thể với root, bạn có thể điều chỉnh oom_adjcá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_adjgiá 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 -17phạ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:

  1. Ứng dụng tiền cảnh
  2. Ứng dụng hữu hình
  3. Máy chủ thứ cấp
  4. Ứng dụng ẩn
  5. Nhà cung cấp nội dung
  6. Ứ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_adjgiới hạn giá trị và các ứng dụng sẽ thuộc một trong các nhóm đó theo oom_adjgiá trị được gán cho ứng dụng cụ thể đó. "Ứng dụng tiền cảnh" thường có oom_adjgiá trị bằng 0hoặ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_adjgiá trị thay đổi theo trạng thái của ứng dụng người dùng; đó là 0khi ứ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).

nhập mô tả hình ảnh ở đây

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 ý:

  1. 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_adjcũng được duy trì cho khả năng tương thích.

  2. 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.
  3. 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:

nhập mô tả hình ảnh ở đây

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


  1. Đ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
      
  2. 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)

nhập mô tả hình ảnh ở đây

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_adjcho 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)

  1. 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

  1. Quản lý RAM Android (Tín dụng đặc biệt: mrhnet )
  2. Bộ nhớ khóa
  3. Xposed - Thông tin chung, phiên bản & thay đổi

Cảm ơn lời giải thích rất chi tiết này. Điều này rất có thể xứng đáng với tiền thưởng, nhưng hãy để tôi suy nghĩ về điều này và đặt một số câu hỏi đầu tiên. Nhân tiện, câu hỏi đầu tiên là: vì vậy không cần root máy, không có cách nào để xử lý vấn đề, ngoại trừ việc xóa nhiều ứng dụng và hy vọng rằng bộ nhớ được tải ít hơn?
YakovL

Một câu hỏi khác là: những giá trị nào tôi có thể nhìn thấy mà không cần root máy? Tôi đã thực hiện một thử nghiệm đơn giản khi tôi chuyển từ FF sang ứng dụng ảnh và ghép đôi các ứng dụng khác và chuyển trở lại FF và nó đã được tải và tải trở lại. Theo âm mưu của Simple System Monitor, có ít nhất 300 MB RAM miễn phí tại mỗi thời điểm (nhiều hơn 120 MB) và FF vẫn chưa được tải ...
YakovL

1. Tôi không nghĩ có thể thực hiện thủ công mà không cần root vì bạn phải điều chỉnh nhiều tệp hệ thống, trong khi điều chỉnh các giá trị và việc gây rối như vậy đòi hỏi phải có đặc quyền nâng cao hoặc root.
xavier_fakerat

2. Cái mà Android gọi là "RAM miễn phí" không nhất thiết là miễn phí vì một phần lớn của nó là bộ nhớ đệm (hữu ích để thực thi nhanh các ứng dụng khi khởi chạy lại chúng) sao cho bộ nhớ trống thực tế thậm chí còn nhỏ hơn giá trị tối thiểu 120 MB trong trường hợp này. Tin tốt là hầu hết các nhà phát triển hiện đang mã hóa cài đặt trong ROM của họ cho phép người dùng không root thực hiện điều này một cách dễ dàng
xavier_fakerat

Đừng lo lắng về tiền thưởng, trước tiên hãy cố gắng nhận được nhiều câu trả lời (thậm chí câu trả lời tốt hơn) từ người dùng khác, điều này sẽ cho phép bạn tìm giải pháp hữu ích nhất :)
xavier_fakerat

1

Ứng dụng này, Trình quản lý RAM tuyên bố có thể khóa một số ứng dụng nhất định khỏi cơ chế quản lý RAM của Android.

Hoặc, đi tới Cài đặt → Pin → Tối ưu hóa pin và đặt Firefox thành Không tối ưu hóa có thể giúp một chút.


Vâng, tôi đã thử tùy chọn thứ hai và cũng đã thử tắt tối ưu hóa, điều đó không có ích. Bạn có thể chỉ ra chính xác RAM Manager tuyên bố điều đó không? Theo như tôi có thể thấy, nó chỉ cho phép tránh tối ưu hóa của riêng nó cho một số ứng dụng nhất định (đối với các trình khởi chạy, cụ thể). Nhưng điểm tốt là - tôi nên xem xét các ứng dụng cố gắng kiểm soát LMK và có thể hỏi những người phát triển chúng - họ có thể có thêm một số kiến ​​thức.
YakovL

1

Bài viết ở trên rất kỹ lưỡng, nhưng tôi sẽ thêm hướng dẫn cho một vài mô hình cụ thể (bị đánh cắp từ trang ứng dụng ASM). Lưu ý rằng đối với các ứng dụng sử dụng nhiều bộ nhớ hơn (ví dụ: Firefox), hệ thống có thể cuối cùng sẽ giết ứng dụng khi các ứng dụng khác yêu cầu không gian bộ nhớ. Nếu cần ram được lưu trong bộ nhớ cache, các ứng dụng lớn nhất và lâu đời nhất sẽ đi trước bất kể cài đặt tiết kiệm pin và Firefox là một chi tiêu lớn.


Làm thế nào để đối phó với (đã biết) tiết kiệm pin?

Samsung Trong cài đặt Android> Bảo trì thiết bị> Pin, thêm ứng dụng vào danh sách Ứng dụng không được giám sát

Huawei (tùy thuộc vào kiểu máy) Trong cài đặt Android> Cài đặt nâng cao> Trình quản lý pin, thêm ứng dụng vào danh sách Ứng dụng được bảo vệ hoặc: Pin> Đóng ứng dụng sau khi khóa màn hình, bỏ chọn ứng dụng khỏi màn hình Khóa

Xiaomi Trong ứng dụng Bảo mật của bạn: Pin%> Trình tiết kiệm pin cho ứng dụng, chọn ứng dụng rồi Không hạn chế và: Trong ứng dụng Bảo mật của bạn: Quyền> Tự động khởi động sau đó cho phép ứng dụng được khởi động.

Asus (Zenfone) Mở Trình quản lý khởi động tự động của bạn và cho phép ứng dụng được khởi động.

OnePlus Trong cài đặt Android> Pin> Menu> Ngủ đông và ngủ đông ứng dụng, kiểm tra ứng dụng để loại trừ nó khỏi các ứng dụng được tối ưu hóa.

Infinix Mở ứng dụng Xmanager của bạn, Trình quản lý tự khởi động và cho phép ứng dụng được khởi động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.