AOSP CachedAppOptimizer 凍結方案

背景

Android 一直面臨一個核心難題:如何優化進程對有限系統資源(如 CPU、電量)的使用,同時保證用戶體驗。

當進程進入后臺后,它們雖不再貢獻用戶體驗,卻仍可能消耗資源。傳統的殺后臺方案雖然節省資源,但會導致用戶抱怨(如影響多任務和啟動速度)。如今,隨著內存容量提升,進程凍結方案(蘋果的墓碑機制)成為更優解——它既能保留后臺進程(保障快速啟動),又能嚴格限制其 CPU 和電量消耗。

原生方案開關

Google 在android 11 原生代碼開始引入進程凍結方案,可能基于代碼不穩定考慮,整個功能默認是關閉的,然后在android 12 重新做了一些修改后,默認是打開狀態。

可以通過如下方式打開或者關閉原生進程凍結功能:

方式一 開發者選項 “Suspend execution for cached apps”。 可選項一共有三個, Device default, Enabled 和Disabled,android 11 default 是關閉,android 12 default 默認是打開

0

方式二 adb 命令: adb shell settings put global cached_apps_freezer

以上兩種方式都需要重啟手機生效

原生進程凍結方案框架圖

0

Framework 上層主要由兩個類控制, OomAdjuster 負責計算APP的oom_score_adj,一旦某個APP的adj大于等于CACHED_APP_MIN_ADJ,就會將凍結該進程的工作委托給CachedAppOptimizer去處理,后者跑在獨立的線程,然后通過jni層接口調用到cgroup的native層。

cgroup抽象層編譯成庫libprocessgroup。抽象層通過往cgroup的文件節點寫入相應的值,來觸發kernel的回調,代碼路徑system\core\libprocessgroup,具體是往/sys/fs/cgroup///cgroup.freeze 節點寫入1凍結,寫入0解凍。

最終kernel cgroup機制的freezer控制子系統真正實現了凍結進程的功能,如下所示:

0

被凍結的進程,會在freeze_schdule中主動放棄CPU使用權限,將CPU讓給當運行隊列rq中的下一個任務執行,實現的用戶進程的無感凍結。

原生凍結例子

應用A打開到前臺,使用完后,退到后臺,啟動應用B,然后A變成前APP級別,adj變成700,然后再打開應用C,這時如果A沒有啟動服務或者接受廣播之類的,就會變成cached級別應用,那么系統就會設置一個10分鐘的超時,如果10分鐘的時間內,adj的級別沒有變化或者沒有小于cached級別,系統就會觸發凍結A,如果adj變化為小于cached級別,那么就會取消凍結A

0

原生框架流程

相關代碼路徑

frameworks/base/services/core/java/com/android/server/am/OomAdjuster.java frameworks/base/services/core/java/com/android/server/am/CachedAppOptimizer.java frameworks/base/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp frameworks/base/core/java/android/os/Process.java frameworks/base/core/jni/android_util_Process.cpp

0

原生凍結細節

第一步,檢查文件鎖"/proc/locks"的狀態。這是為了防止凍結進程持有文件鎖引起死鎖。考慮到一些特殊場景下,進程在被凍結的過程中拿住了文件鎖,凍結成功后還會再檢查一次,發現持有鎖就立刻解凍。

第二步,freeze binder,先是處理當前待處理的binder通信請求,如果進程需要處理的binder請求過多導致在100ms內無法完成,則重新在10分鐘后再次進行凍結流程。如果該過程在100ms內成功,后面禁掉該進程對同步binder請求的接收和處理,以及對異步binder請求的處理。

第三步,setProcessFrozen,調用抽象層提供的API凍結進程。

第四步,再次檢查該進程有沒有需要處理的binder請求,有則解凍進程,然后在10分鐘后再次觸發凍結。這個檢查是為一些特殊場景下,進程在被凍結的過程中產生了binder請求。

原生方案不足

0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902718.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902718.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902718.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實體店的小程序轉型之路:擁抱新零售的密碼-中小企實戰運營和營銷工作室博客

實體店的小程序轉型之路:擁抱新零售的密碼-中小企實戰運營和營銷工作室博客 在當今數字化浪潮的沖擊下,實體店面臨著前所未有的挑戰,但小程序的出現為實體店轉型新零售帶來了新的曙光。先來看一組驚人的數據,據相關統計&#xff…

Java求職面試:從Spring Boot到微服務的全面考核

Java求職面試實錄:從Spring Boot到微服務的全面考核 第一輪:基礎技術的考察 場景: 趙大寶走進了一家互聯網大廠的面試間,面試官嚴肅地看著他。 面試官: 趙大寶,你好。我們先從簡單的開始。請你解釋一下J…

記錄一個坑關于STM32 ARM Compiler Version

在用 Keil 進行 STM32 開發的時候,一開始下載,下載的 ARM 編譯器是 Version6,他就不兼容老的代碼,就很抽象。 所以必須要更換編譯器。 可以去官網下載編譯器 Downloads - Arm Developer ,也可以自己找資源哈&#xff…

PCIe體系結構學習入門——PCI總線概述(二)PCI總線的橋和配置

這里寫目錄標題 序言存儲器域和 PCI 總線域HOST 主橋PCI 橋和 PCI 設備配置空間PCI 橋PCI 設備配置空間PCI 總線的配置非透明 PCI 橋序言 接續前章內容,本章繼續講述 PCI 總線概述的第二部分——PCI 總線的橋和配置。 如果需要進一步了解前一章節內容,可以訪問:PCIe體系結構…

潯川代碼編輯器v2.0(測試版)更新公告

潯川代碼編輯器v2.0(測試版)更新公告 發布日期:** 2023年4月30日 我們很高興地宣布潯川代碼編輯器v2.0測試版即將上線!本次更新帶來了多項功能改進和問題修復,旨在為用戶提供更穩定、更強大的編程體驗。 主要更新內容 1. **Bug修復與穩定性提…

微信小程序 tabbar底部導航欄

官方文檔:https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html#tabBar 一、常規菜單格式 在app.json 文件中配置,其他關鍵點詳見官方文檔,后續更新不規則圖標的寫法

Spring 中@Autowired,@Resource,@Inject 注解實現原理

使用案例 前置條件: 現在有一個 Vehicle 接口,它有兩個實現類 Bus 和 Car ,現在還有一個類 VehicleService 需要注入一個 Vehicle 類型的 Bean: public interface Vehicle {}Component public class Car implements Vehicle {}C…

【Rust結構體】Rust結構體詳解:從基礎到高級應用

?? 歡迎大家來到景天科技苑?? 🎈🎈 養成好習慣,先贊后看哦~🎈🎈 🏆 作者簡介:景天科技苑 🏆《頭銜》:大廠架構師,華為云開發者社區專家博主,…

《LightLLM:開啟大語言模型推理新時代》

《LightLLM:開啟大語言模型推理新時代》 大語言模型推理的困境與挑戰 在當今人工智能飛速發展的時代,大語言模型(LLMs)無疑是最為耀眼的明星技術之一。從 OpenAI 的 GPT 系列到谷歌的 BERT,再到國內如百度文心一言、阿里通義千問等,大語言模型以其強大的語言理解和生成能…

【Python Web開發】02-Socket網絡編程02

文章目錄 1. 服務器端1.1 socket.socket()1.2 socket.bind()1.3 socket.listen()1.4 socket.accept()1.5 socket.recv()1.6 socket.send() 和 socket.sendall()1.7 socket.close() 2. 客戶端2.1 socket.socket()2.2 socket.connect()2.3 socket.send() 和 socket.sendall()2.4 …

Flutter 在全新 Platform 和 UI 線程合并后,出現了什么大坑和變化?

Flutter 在全新 Platform 和 UI 線程合并后,出現了什么大坑和變化? 在兩個月前,我們就聊過 3.29 上《Platform 和 UI 線程合并》的具體原因和實現方式,而事實上 Platform 和 UI 線程合并,確實為后續原生語言和 Dart 的…

藍橋杯 1. 四平方和

四平方和 原題目鏈接 題目描述 四平方和定理(又稱拉格朗日定理)指出: 每個正整數都可以表示為 至多 4 個正整數的平方和。 如果將 0 包括進去,則每個正整數都可以恰好表示為 4 個非負整數的平方和。 例如: 5 0 …

開發并發布一個屬于自己的包(npm)

一、CommonJS規范導入require 創建一個npm包涉及幾個步驟,包括設置你的項目結構、編寫代碼、編寫文檔、測試你的代碼,以及發布到npm倉庫。以下是一個基本的指南,幫助你從頭開始創建一個npm包。 步驟 1: 初始化npm項目 創建項目文件夾&#x…

CRTP(Curiously Recurring Template Pattern)

C 中的 CRTP(奇異遞歸模板模式) CRTP(Curiously Recurring Template Pattern)是一種利用模板繼承實現 靜態多態(Static Polymorphism) 的設計模式。通過基類模板以派生類作為模板參數,CRTP 允許…

小白工具視頻轉MPG, 功能豐富齊全,無需下載軟件,在線使用,超實用

在視頻格式轉換需求日益多樣的今天,小白工具網的在線視頻轉 MPG 功能https://www.xiaobaitool.net/videos/convert-to-mpg/ )脫穎而出,憑借其出色特性,成為眾多用戶處理視頻格式轉換的優質選擇。 從格式兼容性來看,它支…

銀河麒麟系統離線安裝nodejs

本篇文章我們介紹如何通過nvm(node版本管理工具)來實現離線安裝nodejs 第一步:下載nvm https://github.com/nvm-sh/nvm/releases/tag/v0.40.1 在頁面找到【Source code(tar.gz)】下載 第二步:安裝nvm 將下載好的tar.gz拷貝到銀河麒麟系統文件夾下(加…

Go語言中包導入下劃線的作用解析

在Go語言的代碼中,有時會看到類似以下的導入語句: import _ "github.com/mattn/go-sqlite3"這種以下劃線_開頭的導入方式,顯得有些特別,尤其是對于新手來說,可能會感到困惑,為什么要這樣寫&…

Winddows11官網下載安裝VMware Workstation Pro17(圖文詳解)

Winddows11安裝VMware17 1、官網下載2、安裝3、總結 1、官網下載 官網地址 點擊Products,滑到最下面,選擇SEE DESKTOPP HYPERVISORS 選擇 DOWNLOAD FUSION OR WORKSTATION 自動跳轉到下面哪個服界面,注冊 輸入郵箱地址和圖片下面的文字…

DeepSeek智能時空數據分析(二):3秒對話式搞定“等時圈”繪制

序言:時空數據分析很有用,但是GIS/時空數據庫技術門檻太高 時空數據分析在優化業務運營中至關重要,然而,三大挑戰仍制約其發展:技術門檻高,需融合GIS理論、SQL開發與時空數據庫等多領域知識;空…

【Linux網絡】應用層自定義協議與序列化及Socket模擬封裝

📢博客主頁:https://blog.csdn.net/2301_779549673 📢博客倉庫:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正! &…