Android: Wakelocks and TuxOnIce

android 快速启动 hibernate,Android快速启动方案设计原理(hibernation/HyperBoot) 概要原理如下:1. 在kernel空间使用tuxonice(suspend2的演进版本)进行suspend to disk(hibernation),主要动作是保存当前内存中所有的有效内容到hibernate image预留分区,写入前使用lzo算法进行压缩(启动的时间主要取决于image的大小)2. Kill掉不重要的service进程(可配置),以减少要已用的内存空间。3. 在Uboot启动时... 阅读详情

转自:http://kanru.info/blog/archives/2011/06/29/android-wakelocks-n-tuxonice/


最近為了把 TuxOnIce 整到 Android 上面,著實把 Linux 的電源管理系統中關於 suspend 與 hibernation 的部份研究了一下。而 Android 為了增加待機時間加入了 wakelock 的機制,讓情況變得更加複雜。

TuxOnIce

TOI Patch

TuxOnIce 簡稱 TOI,前身是 Software Suspend 2,是一個長期在 linuxupstream 以外耕耘的一個休眠補釘,相較於早期整合到 linux kernel 內的swsusp,TOI 的功能非常豐富,可以指定把記憶體內容儲存到多種不同的位置,如檔案或置換空間,還可以選擇不同的壓縮方法。

首先幫 ARM 平台加上基本的休眠功能,使用 Hiroshi DOYU 的 patch:

http://article.gmane.org/gmane.linux.power-management.general/20543

然後到 TOI 網站下載最新的 3.2 補釘,打上去的時候會有一些衝突但是都還滿容易解決,要注意的是某些衝突是看不出來的,例如因為函式移動位置而造成重複定義,要小心檢查。

然後因為 TOI 對於非 x86 平台有一些假設現在已經不適用,所以需要修改

https://gitorious.org/0xlab-kernel/kernel/commit/e551caf

OMAPFB

使用 Pandaboard 加上 Android 測試才發現從休眠醒來後 LCD 不會自動點亮,通常在 x86 平台上有 pm-utils 或是 hibernate script 來幫忙處理這種關閉打開 LCD 的問題,這次我是先在 kernel 內幫 OMAPFB 加上一個電源管理的呼叫,讓 kernel 醒來的時候自己重新設定 LCD。

https://gitorious.org/0xlab-kernel/kernel/commit/21e0f14

Pandaboard & Beagleboard xM

在 Pandaboard 或 Beagleboard xM 上面沒有 NAND 可以當作儲存空間,所以一般都是把檔案放在MMC 上面,第一個 patch 讓 kernel 在開機的時候不要初始化不存在的 NAND 空間

https://gitorious.org/0xlab-kernel/kernel/commit/3ae6b4c

然後因為 MMC 的 probe 需要時間,第二個 patch 讓 TOI 等待指定的 resumedevice 已經偵測到之後才開始進行 resume

https://gitorious.org/0xlab-kernel/kernel/commit/1078bd7

Wakelock

wakelock 是 Android 為了讓裝置可以更積極的休眠又不妨礙正常工作的進行而加入的機制,究竟是好是壞已經在 LKML 與 LWN 上面討論過非常多次,可以參考:

失眠症

開始測試 TOI 的效果時遇到的第一個問題就是失眠症,因為 wakelock 從中作梗,導致每次休眠到一半就被取消掉。原來是因為 TOI 的休眠途徑會先強制檔案系統把內容寫回,而 MMC 子系統會在寫入/讀取一段時間後嘗試進入低耗電模式,偏偏 Android 在這裡安插了一個 wakelock,導致之後要凍結所有執行緒的時候失敗。

解法,首先因為休眠的後半段路徑其實就是要準備進行關機,而一般來說休眠都是人為啟動,因此可以假設此時使用者了解工作可能還未完成,可以忽略wakelock,所以第一個 patch 就是讓休眠的路徑不去檢查 wakelock,避免像MMC 這樣的問題。

https://gitorious.org/0xlab-kernel/kernel/commit/3bb5d6f

接下來是一般的待機路徑,似乎是因為新的 kernel 會積極的嘗試把 MMC 變成低耗電模式,但 OMAP 預設的 MMC timeout 是 100 毫秒,把工作放在 Queue裡面反而不斷鎖住 wakelock 讓 Android 無法休眠,第二個 patch 就是讓 MMC子系統在準備休眠的時候就不要作無謂的掙扎,直接進入低耗電模式。

https://gitorious.org/0xlab-kernel/kernel/commit/88823b9

嗜睡症

解決了失眠症沒想到接下來遇到嗜睡症,因為手機插著 USB 的時候是不會真正睡著的,所以一直沒機會觀察 Android 睡著是怎麼樣,原來只把 kernel 叫醒是沒用的,Android 還會檢查目前的 input event 是否屬於 user activity 的範圍,是的話才會把整個系統帶醒,不然因為 wakelock 的機制,馬上就會又睡著。

參考:



Android快速启动方案设计原理(hibernation/HyperBoot) 上回书说到用户空间使用命令“echo disk /sys/power/state”,最终调用到kernel/power/main.c中的hibernate()函数启动hibernation流程。 pm_prepare_console();//给suspend分配一个虚拟终端来输出信息 pm_notifier_call_chain(PM_HIBERNATION_PREPARE);//通过noti 阅读详情

相关推荐

RK3572-Android16-记录一次OTA升级失败解决方案

这里记录一次解决RK3576 Android16 OTA 用Recovery 升级失败的一次解决案例,将部分经验作为总结。本次OTA升级耗时了几天,最终是RK给出的解决方案,再加上经验来解决了其它部分问题新平台,高一点的Android版本,可能本身有bug,多请教平台来,不要蒙着干,干不出来的。

十年饮冰,难凉热血 127

TuxOnIce! 休眠到硬盘[zt]

最近开始用baselayout-2(openrc)了,启动速度提升了10秒钟,但还是不爽,而且启动期间读硬盘也是相当的猛,读的我那可怜的SATA硬盘不停嚎叫。突然想,何不让我的台式机也学笔记本休眠一下?主要参考:http://www.gentoo-wiki.com/HOWTO_TuxOnIcehttp://overlays.gentoo.org/dev/jokey/brows...

weixin_33672400的博客 299

IEC61850 通信协议测试验证实战指南:从理论到实践

本文提供了一份IEC61850通信协议从理论到实践的完整测试验证实战指南。针对MMS、GOOSE、SV三大核心协议,详细阐述了测试环境搭建、自动化脚本编写、性能与异常测试方法,并分享了常见避坑经验,旨在帮助工程师通过系统化的测试验证,确保电力自动化设备在现场的互联互通与稳定可靠运行。

neovim7hacker的博客 156

电源管理之android内核suspend to disk的实现(九)--tuxonice实现方案

完成在标准内核基础上的android系统的suspend to disk后,又采取了tuxonice补丁的方式进行比较,发现由于压缩的缘故,速度有所提高10s左右。 该范方案的实现我是根据我的一位离职的同事写学习笔记进行测试,实验证明是可行的,以下部分程序的讲解我也直接进行了引用。 要是大家遇到啥问题,可以一起讨论。。。。。 概要: 1. 目标 2. 概要 3. 操作流程 4.

中华田园犬 7082

Qoder Quest 模式实战:从需求到代码的自动化开发

本文深入探讨Qoder Quest模式如何实现从需求到代码的自动化开发。通过编写清晰的Spec规格说明,Qoder能智能分解任务并在后台执行,生成高质量代码,大幅提升开发效率,让开发者专注于架构设计等创造性工作。

herb5的博客 1152

CST仿真实例001:圆极化平板天线仿真

CST仿真实例001:圆极化平板天线仿真实例

weixin_47638568的博客 1万+

android init.rc 属性分析

在 Android中使用启动脚本init.rc,可以在系统的初始化过程中进行一些简单的初始化操作。这个脚本被直接安装到目标系统的根文件系统中,被 init可执行程序解析。 init.rc是在init启动后被执行的启动脚本. (1)android启动文件系统后调用的第一个应用程序是/init,此文件的很重要的内容是解析了init.rc和init.xxx.rc 两个配置文件

lb5761311的专栏 3350

【NLP】文献翻译4——CH-SIMS:中文多模态情感分析数据集与细粒度的模态注释

CH-SIMS: A Chinese Multimodal Sentiment Analysis Dataset with Fine-grained Annotations of Modality摘要1. 介绍2. 相关工作2.1 多模态数据集2.2 多模态情感分析2.3 多任务学习3. CH-SIMS 数据集3.1 数据获取3.2 标注3.3 特征提取4. 多模式多任务学习框架4.1 单模态子网4.2 特征融合网络4.3 优化目标5. 实验5.1 基准5.2 实验的细节5.3 结果和讨论5.3.1 与

YoungSeng's Blog 1万+

Fedora10+thinkpadT400+ATI显卡,无法正常休眠解决方法

几个月前一直无法正常的休眠,只要点击休眠,就是先转入TEXT模式,紧接着硬盘响一下,就又跳回到了用户登陆界面。本来想就这么凑合用吧,但后来觉得不是个事,没有休眠功能的笔记本电脑还不如台式机爽。解决的办法要多亏Tuxonice,这是一个内核补丁,所以,如果想要使用tuxonice管理你系统的休眠就要将tuxonice加入内核源代码,编译内核。实现tuxonice管理suspend主要

今天只做一件事 1171

46.qt quick-自定义非常好看的qml虚拟软键盘-支持换肤、动态加载移除语言(二)

在上章我们学习了45.qt quick-qml虚拟软键盘详解(一)_诺谦的博客-优快云博客 接下来我们便来自定义一款好看的qml软键盘.如下图所示: 支持背景更换、支持动图: 支持动态加载移除语言: 支持拖拽、自由缩小放大: 支持定位坐标: ...

抵抗时间扭曲,坚持做一件有意义的事 4674

【算能】TPU(张量处理单元)的深度解析

算能(SOPHGO)作为国产AI芯片领域的核心企业,其TPU(张量处理单元)以高能效比与全场景覆盖能力为核心竞争力,专注于边缘计算与行业垂直领域的AI推理加速。

浩瀚之水的专栏 1548

linux系统待机时长怎么设置,什么是Linux操作系统下的休眠与待机?

内核2。6。23以前要用suspend2-source,以后就用tuxonice-source了。1、安装tuxonice-source和hibernate-script前者是打了休眠和待机功能的补丁的内核源码包,后者是提供了用户执行休眠和待机的脚本。2、编译内核下面是我的配置 * Power Management support │ │ │ │ [ ] Legacy Power Manageme...

weixin_35762250的博客 356

基于GA-BP遗传算法优化神经网络的多输入多输出数据预测-Python代码实现

多输入多输出的GA-BP神经网络

2301_80449389的博客 2308

linux 电源管理 12,Linux电源管理(12)_Hibernate功能

Linux电源管理(12)_Hibernate功能作者:Physh 发布于:2014-12-22 11:51分类:电源管理子系统出于省电和快速开机的需求, Hibernation经常被应用到Laptop和移动终端上,本文就简单讲讲Hibernation的一种实现实现方法,SWSUSP( Swap Suspend),其实swsusp从2.6开始就已经被引入到内核版本树中了,所以如果想分析swsusp...

weixin_28979339的博客 481

2026数学建模国赛D题:时频冲突检测与消解 论文解析

最终无需撤销任何计划,共调整110个计划,其中频移43个、时移48个、间隔调整19个,总调整幅度528。附件模板只要求填写新增计划的频段区间和首次时间区间,没有要求填写宽度、间隔和次数,因此本文按附件中C类装备的统一需求特征处理:每个新增计划占用3个连续频段,持续2个时间单位,间隔8,使用12次。本文针对有限频带内大量周期性用频计划的时频冲突检测、单参数消解、无冲突条件下新增C类计划装载,以及允许调整间隔时长后的再次消解问题,建立了由占用展开、冲突图、组合动作集、精确约束满足和二维资源装箱组成的统一模型。

YOLO 190

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

关于电源管理:待机(Suspend,STR,挂起)/休眠(Hibernation,STD)问题的再讨论

关于电源管理(Power Management)中挂起和休眠方面论坛上有一些帖子了,不过对于挂起和休眠的实现好像还不是非常的清晰,主要是各个机型的差异较大,尤其是使用笔记本电脑(laptop, notebook)的朋友在这方面的问题比较多。我在这里写一些讨论,很多问题还没有解决,希望能够抛砖引玉。   首先我解释一下这里所说的挂起和休眠的含义,有的帖子中这些概念经常和屏幕保护中的“挂起”搞混

yarsen的专栏 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android 中的dm-verity

Android 中的Verified Boot之dm-verity之前做了一个Verified Boot模块相关的工作,但是在网上只有找到google的文档和一个nexus的patch。虽然有patch,但在不同版本的代码上实现起来却可能有一些bug,所以特此记录一下debug这个东西的过程。之前debug的过程一直没找到问题,归根到底还是这个原理没搞清楚就下手,所以我分成原理,接口和应用来说明dm

u011280717的博客 5万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android 开发入门实践(二):Kotlin 空安全,从可空类型到安全访问

延续 NewsApp 项目中的新闻标题练习,记录 Kotlin 安全调用。

Easyhood的博客 290

Android 模块化收口:能力组合框架、手写 LifecycleOwner 与热修复共存

二十多个模块业务高度相似却各有差异,核心矛盾在于“统一与灵活”的平衡。通过角色接口组合(如IProjectAware、IVoiceAware)实现能力按需注入,新增功能零侵入;用模板方法锁定生命周期流程,确保顺序一致;结合@CallSuper与工厂方法,既约束关键逻辑,又保留子类自由。最终实现:骨架统一、填空自由,管得住业务,又不侵入业务。

mmsx990的博客 397

Android 开发入门实践(十三):用 Intent、UiState 和 Reducer 理解 MVI 的状态更新

本文记录第141—145课对MVI架构的入门实践,通过“返回列表”功能逐步构建意图(NewsIntent)、状态(NewsUiState)与状态转换(reduce)机制。基于单向数据流,用户操作生成意图,ViewModel通过Reducer根据旧状态计算新状态,并通过StateFlow更新Compose界面。代码实现清晰分离关注点,强化了对状态管理、事件驱动与数据流的理解。

Easyhood的博客 326

Android Message源码阅读

本文梳理了Android Handler机制中Message的核心设计:链表结构、消息复用池(sPool)及回收机制,重点解析了异步消息与同步屏障(SyncBarrier)的协同机制。当主线程需优先处理UI绘制等高优先级任务时,系统通过postSyncBarrier插入屏障,使Looper跳过普通同步消息,优先执行标记为异步的UI渲染任务,确保帧率流畅。该机制是保障Android界面响应性的关键技术之一。

u012116089的博客 201

安卓部署Linux性能实测:一颗移动处理器,能否胜任日常 Linux 开发?

本文通过在一加Ace5上部署NimoteCode的ARM64 Linux环境,测试了其在CoreMark、SQLite编译及并行构建中的表现。结果显示,尽管单核性能约2.34GHz,多核扩展比达6.15×,但优化编译耗时仍高达35秒,反映移动处理器虽具备一定开发能力,却受限于文件系统开销与运行环境(如PRoot)。实际开发中,非优化构建效率较高,而并行编译可显著提速。结论:安卓手机可作为轻量级开发辅助工具,但无法替代桌面环境,真正价值在于便携性与即时响应,而非全功能替代。

一个不知名码农的专栏 324

Android 17 全栈性能分析关键字与源码手册

FrameTimeline 找异常帧,ATrace 找阶段,thread_state 找等待类型,ftrace 找内核原因,Simpleperf 找 CPU 热点,驱动源码找最终触发条件;任何根因结论都必须回到同一对象、同一时间窗口和同一条依赖链。

weixin_43228946的博客 373

CTF 命令执行题学习笔记:终端特殊字符 $IFS 与 %09 的用法(HelloCTF RCE-labs)

空格被过滤时:用%09(TAB)或$IFS代替空格关键词被过滤时:用通配符?或字符类[f]拼出被禁的词,让 WAF 在原始字符串里看不到它,shell 在执行时再展开这类技巧在后续的命令执行题里会反复用到,建议亲手在靶机上敲一遍感受一下。

YY888888_的博客 542

Android 开发入门实践(九):把新闻数据与页面状态交给 ViewModel

本文记录第110—117课学习成果:将页面标题、新闻列表及选中编号逐步迁移至NewsViewModel,通过ViewModelProvider获取实例并读取数据。页面调用ViewModel方法处理选择与返回,实现状态管理解耦。过程中纠正了对Activity重建机制的误解,并厘清mutableStateOf的可观察性与ViewModel对象生命周期的区别,深化了对Compose状态更新机制的理解。

Easyhood的博客 221

云手机私有化部署完整方案:基于ARM服务器搭建私有安卓云集群

ARM 服务器是私有化安卓云集群最优硬件底座,原生架构匹配 Android,高密度、低损耗,非常适合企业内网场景。整套私有化方案的核心,从来不是 “跑起来安卓”,而是隔离可控、可审计、可运维、可扩容。两条路线各有取舍:开源自建灵活、门槛高;商用私有化交付开箱即用、安全能力完备,是当前企业生产环境主流方案。六边云手机私有化方案,补齐了自建方案在驱动适配、管控平台、审计合规、信创适配上的短板,适合对数据主权、内网隔离有强需求的政企、自研 App、垂直行业客户。

a598652的博客 335
上一篇: Android 安全机制
下一篇: Linux 调度器 BFS 简介 BFS vs CFS
RyanLeiWang
博客等级 码龄20年 184粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值