Android Power Management

用 SE84 反查 SAP 消息号:弹窗一闪而过也能抓到 Message ID 和 Number 的小技巧 SAP开发技巧:通过消息文本反查Message ID和编号 在SAP开发中,经常遇到系统只显示错误消息文本而缺少技术信息的情况。本文介绍两种实用方法: 使用SE84工具:通过输入带通配符的短文本(如"错误文本")反向查找消息类和编号 直接查询T100表:利用消息文本在T100表中检索完整的消息技术信息 这些技巧特别适用于处理弹窗消息、框架层错误等无法直接获取技术细节的场景。掌握消息ID和编号后,开发者可以更高效地进行问题定位、代码调试和错误处理,尤其在SAP Gateway、RAP等现代 阅读详情

    总体上来说 Android 的电源管理还是比较简单的 , 主要就是通过锁和定时器来切换系统的状态 , 使系统的功耗降至最低 , 整个系统的电源管理架构图如下 : ( 注该图来自 Steve Guo)

 

Android power management block diagram  

接下来我们从 Java 应用层面 , Android framework 层面 , Linux 内核层面分别进行详细的讨论 :

应用层的使用 :

Android 提供了现成 android.os.PowerManager 类 , 该类用于控制设备的电源状态的切换 .

该类对外有三个接口函数 :

         void goToSleep(long time); // 强制设备进入 Sleep 状态

         Note:

尝试在应用层调用该函数 , 却不能成功 , 出现的错误好象是权限不够 , 但在 Framework 下面的 Service 里调用是可以的 .

         newWakeLock(int flags, String tag);// 取得相应层次的锁

flags 参数说明 :

PARTIAL_WAKE_LOCK: Screen off, keyboard light off

SCREEN_DIM_WAKE_LOCK: screen dim, keyboard light off

SCREEN_BRIGHT_WAKE_LOCK: screen bright, keyboard light off

FULL_WAKE_LOCK: screen bright, keyboard bright

ACQUIRE_CAUSES_WAKEUP: 一旦有请求锁时强制打开 Screen 和 keyboard light

ON_AFTER_RELEASE: 在释放锁时 reset activity timer

Note:

如果申请了 partial wakelock, 那么即使按 Power 键 , 系统也不会进 Sleep, 如 Music 播放时

如果申请了其它的 wakelocks, 按 Power 键 , 系统还是会进 Sleep

         void userActivity(long when, boolean noChangeLights);//User activity 事件发生 , 设备会被切换到 Full on 的状态 , 同时 Reset Screen off timer.

Sample code:

         PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);

PowerManager.WakeLock wl = pm.newWakeLock (PowerManager.SCREEN_DIM_WAKE_LOCK, “My Tag”);

         wl.acquire();

         …….

         wl.release();

Note:

1. 在使用以上函数的应用程序中 , 必须在其 Manifest.xml 文件中加入下面的权限 :

    <uses-permission android:name="android.permission.WAKE_LOCK" />

<uses-permission android:name="android.permission.DEVICE_POWER" />

2. 所有的锁必须成对的使用 , 如果申请了而没有及时释放会造成系统故障 . 如申请了 partial wakelock, 而没有及时释放 , 那系统就永远进不了 Sleep 模式 .


Android Framework 层面 :

其主要代码文件如下 :

frameworks/base/core/java/android/os/PowerManager.java

frameworks/base/services/java/com/android/server/PowerManagerService.java

frameworks/base/core/java/android/os/Power.java

frameworks/base/core/jni/android_os_power.cpp

hardware/libhardware/power/power.c

其中 PowerManagerService.java 是核心 , Power.java 提供底层的函数接口 , 与 JNI 层进行交互 , JNI 层的代码主要在文件 android_os_Power.cpp 中 , 与 Linux kernel 交互是通过 Power.c 来实现的 , Andriod 跟 Kernel 的交互主要是通过 sys 文件的方式来实现的 , 具体请参考 Kernel 层的介绍 .

 

这一层的功能相对比较复杂 , 比如系统状态的切换 , 背光的调节及开关 ,Wake Lock 的申请和释放等等 , 但这一层跟硬件平台无关 , 而且由 Google 负责维护 , 问题相对会少一些 , 有兴趣的朋友可以自己查看相关的代码 .


Kernel 层 :

其主要代码在下列位置 :

drivers/android/power.c

其对 Kernel 提供的接口函数有

EXPORT_SYMBOL(android_init_suspend_lock); // 初始化 Suspend lock, 在使用前必须做初始化

EXPORT_SYMBOL(android_uninit_suspend_lock); // 释放 suspend lock 相关的资源

EXPORT_SYMBOL(android_lock_suspend); // 申请 lock, 必须调用相应的 unlock 来释放它

EXPORT_SYMBOL(android_lock_suspend_auto_expire);// 申请 partial wakelock, 定时时间到后会自动释放

EXPORT_SYMBOL(android_unlock_suspend); // 释放 lock

EXPORT_SYMBOL(android_power_wakeup); // 唤醒系统到 on

EXPORT_SYMBOL(android_register_early_suspend); // 注册 early suspend 的驱动

EXPORT_SYMBOL(android_unregister_early_suspend); // 取消已经注册的 early suspend 的驱动

 

提供给 Android Framework 层的 proc 文件如下 :

"/sys/android_power/acquire_partial_wake_lock" // 申请 partial wake lock

"/sys/android_power/acquire_full_wake_lock" // 申请 full wake lock

"/sys/android_power/release_wake_lock" // 释放相应的 wake lock

"/sys/android_power/request_state" // 请求改变系统状态 , 进 standby 和回到 wakeup 两种状态

"/sys/android_power/state" // 指示当前系统的状态

 

Android 的电源管理主要是通过 Wake lock 来实现的 , 在最底层主要是通过如下三个队列来实现其管理 :

static LIST_HEAD(g_inactive_locks);

static LIST_HEAD(g_active_partial_wake_locks);

static LIST_HEAD(g_active_full_wake_locks);

所有初始化后的 lock 都会被插入到 g_inactive_locks 的队列中 , 而当前活动的 partial wake lock 都会被插入到 g_active_partial_wake_locks 队列中 , 活动的 full wake lock 被插入到 g_active_full_wake_locks 队列中 , 所有的 partial wake lock 和 full wake lock 在过期后或 unlock 后都会被移到 inactive 的队列 , 等待下次的调用 .

在 Kernel 层使用 wake lock 步骤如下 :

1.        调用函数 android_init_suspend_lock 初始化一个 wake lock

2.        调用相关申请 lock 的函数 android_lock_suspend 或 android_lock_suspend_auto_expire 请求 lock, 这里只能申请 partial wake lock, 如果要申请 Full wake lock, 则需要调用函数 android_lock_partial_suspend_auto_expire( 该函数没有 EXPORT 出来 ), 这个命名有点奇怪 , 不要跟前面的 android_lock_suspend_auto_expire 搞混了 .

3.        如果是 auto expire 的 wake lock 则可以忽略 , 不然则必须及时的把相关的 wake lock 释放掉 , 否则会造成系统长期运行在高功耗的状态 .

4.        在驱动卸载或不再使用 Wake lock 时请记住及时的调用 android_uninit_suspend_lock 释放资源 .

 

系统的状态 :

         USER_AWAKE, //Full on status

         USER_NOTIFICATION, //Early suspended driver but CPU keep on

         USER_SLEEP // CPU enter sleep mode

其状态切换示意图如下 :

 

system state machine

系统正常开机后进入到 AWAKE 状态 , Backlight 会从最亮慢慢调节到用户设定的亮度 , 系统 screen off timer(settings->sound & display-> Display settings -> Screen timeout) 开始计时 , 在计时时间到之前 , 如果有任何的 activity 事件发生 , 如 Touch click, keyboard pressed 等事件 , 则将 Reset screen off timer, 系统保持在 AWAKE 状态 . 如果有应用程序在这段时间内申请了 Full wake lock, 那么系统也将保持在 AWAKE 状态 , 除非用户按下 power key. 在 AWAKE 状态下如果电池电量低或者是用 AC 供电 screen off timer 时间到并且选中 Keep screen on while pluged in 选项 ,backlight 会被强制调节到 DIM 的状态 .

如果 Screen off timer 时间到并且没有 Full wake lock 或者用户按了 power key, 那么系统状态将被切换到 NOTIFICATION, 并且调用所有已经注册的 g_early_suspend_handlers 函数 , 通常会把 LCD 和 Backlight 驱动注册成 early suspend 类型 , 如有需要也可以把别的驱动注册成 early suspend, 这样就会在第一阶段被关闭 . 接下来系统会判断是否有 partial wake lock acquired, 如果有则等待其释放 , 在等待的过程中如果有 user activity 事件发生 , 系统则马上回到 AWAKE 状态 ; 如果没有 partial wake lock acquired, 则系统会马上调用函数 pm_suspend 关闭其它相关的驱动 , 让 CPU 进入休眠状态 .

系统在 Sleep 状态时如果检测到任何一个 Wakeup source, 则 CPU 会从 Sleep 状态被唤醒 , 并且调用相关的驱动的 resume 函数 , 接下来马上调用前期注册的 early suspend 驱动的 resume 函数 , 最后系统状态回到 AWAKE 状态 . 这里有个问题就是所有注册过 early suspend 的函数在进 Suspend 的第一阶段被调用可以理解 , 但是在 resume 的时候 , Linux 会先调用所有驱动的 resume 函数 , 而此时再调用前期注册的 early suspend 驱动的 resume 函数有什么意义呢 ? 个人觉得 android 的这个 early suspend 和 late resume 函数应该结合 Linux 下面的 suspend 和 resume 一起使用 , 而不是单独的使用一个队列来进行管理 。

http://blog.youkuaiyun.com/hzdysymbol/archive/2009/03/19/4004791.aspx

am62x A53与R5F通信 AM62x是Ti的一款异构多核芯片。remoteproc驱动,硬编码(写死)了R5F/M4F固件的名字,这样驱动启动时,就会找硬件编码的固件,下面是其对应关系。值得注意的是,linux内核中的M4F remoteproc驱动启动M4F,而linux内核中的R5F remoreteproc驱动不启动R5F,相反,它attach到已经在boot阶段启动的R5F固件上。在/lib/firmware的真实固件名:,而我们生成的固件名如下所示,没有直接对应的,经确认,.out文件就是我们需要的,重命名后即可。 阅读详情

相关推荐

金融行业软件测试面试题(含答案)

6、假如发现了一个BUG,跟开发本身没什么关系,涉及到理念,需求问题,如何解决?11、假如要你测试6个月期限的p2p借款产品,你应该怎么设计案例,说出测试点。17、如果京东有一个购物网页给你,你要怎么进行测试?31、我们公司自动化测试用的语言是Java,Java你不会,该怎么办?23、你们测试用的测试环境是谁给的?24、如果领导分配你的任务超出负荷,领导高估了你的能力,怎么办。26、给你一个模块测试,只有一个星期的时间你如何有效率地完成?29、如果你组长的用例写错了,但他认为是对的,你怎么处理?

crhnb的博客 917

android系统电源管理

Android framework 530

Window系统下搭建GIT本地服务器

这是一篇在window下搭建git本地服务器的教程,带你一步步搭建出本地的git服务器。

qwer971211的博客 2万+

Android的电源管理

  接下来我们从Java应用层面, Android framework层面, Linux内核层面分别进行详细的讨论: 应用层的使用: Android提供了现成android.os.PowerManager类,该类用于控制设备的电源状态的切换. 该类对外有三个接口函数:          void goToSleep(long time); //强制设备进入Sleep状态        ...

lcs353732057的专栏 249

SAP FI实战入门:从借贷法则到F-02记账,新手必懂的会计凭证操作

本文详细介绍了SAP FI模块中借贷记账法的核心逻辑及F-02凭证录入的全流程操作。通过实例解析借贷方向规则、科目编码设置及金额镜像原则,帮助新手快速掌握会计凭证操作技巧。同时提供了FS10N余额查询和常见错误排查方法,助力用户高效完成SAP财务记账任务。

weixin_29306571的博客 262

SqlSugar避坑指南:C#操作MySQL时你可能会忽略的5个细节

本文分享了使用C#和SqlSugar框架操作MySQL数据库时的实战避坑指南。针对连接配置、实体映射、查询性能、事务处理等关键环节,深入剖析了5个容易被忽略但至关重要的细节,帮助开发者提升项目稳定性和执行效率,避免常见陷阱。

delta的博客 276

Android电源管理介绍

Framework层有关电源锁的内容是通过PowerManagerService类来实现,这个类是用来管理所有应用程序申请的wakelock,比如音视频播放器,camera等申请的wakelock都是通过这个类来管理的。如果系统申请了PARTIAL_WAKE_LOCK,那么即使按power键,系统也不会进sleep,如music播放时.如果申请了其它的wakelocks,按power键,系统还是会进sleep。Android系统的电源管理框架分成五个部分:应用层,框架层,Native层,HAL层和内核层。

波哥的专栏 1410

用友T3提示,年度[UFDATA_002_2017]并不存在,导致无法备份迁移。

用友T3提示,年度[UFDATA_002_2017]并不存在,导致无法备份迁移。现在都win11了某个年度账套不存在怎么办?

雨季余静的博客 3562

Android电源管理

Android电源管理概述,Android电源管理简介,Android电源管理代码分析

2925

Open Lovable 网站克隆AI工具超详细实战教程(含环境配置、排错与代码修改)

本教程面向有一定计算机基础的新手用户,提供一份全面、深入的 Open Lovable 使用指南。从开发环境搭建、API密钥获取、项目部署到网站克隆、代码下载、本地运行与二次开发,涵盖全流程细节与常见问题解决方案。通过本教程,新手可掌握如何利用AI驱动的Open Lovable工具,将任意目标网站智能复刻为结构清晰、可编辑的现代前端项目(React/Vite),实现快速原型开发与技术学习。

hy行者勇哥的博客 4961

YOLO11多个点组合创新:GC10-DET缺陷检测 | DCNv4结合SPPF+11Detect创新性结合

DCNv4结合SPPF+11Detect创新性结合,原始mAP50为0.633 提升至0.651

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1290

android : power management

thanks to the author:http://huaqianlee.github.io/2015/05/30/Android/Android%E7%94%B5%E6%BA%90%E7%AE%A1%E7%90%86%E6%9E%B6%E6%9E%84/ Android 电源管理架构 ...

hunter 217

一条时间轴上的商品供给:商品供给域事件全景、八大子域事件清单与事件契约规范的工程推演

本文以虚构连锁零售企业“青禾鲜市”为例,用事件风暴重新梳理商品供给域:先剖析同词异义、状态模糊、隐式依赖与被动兜底四类冲突,再以时间轴、八条子域泳道与关键事件铺出全景地图,确立一个事件只有一个户口;随后为总店商品、门店商品、价格、库存、质量、标签、变更通知与操作日志列出聚合、事件、命令与策略,并统一命名、信封结构、版本与幂等规范。程序体检把初稿14个问题清零,仿真显示按聚合版本号更新可售视图可将误判从两位数百分比降到0.019%。文末给出四轮工作坊节奏与新品引入、全国调价、批次召回走查剧本。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 5万+
上一篇: Android中如何修改系统时间(应用程序获得系统权限)
下一篇: android电源管理
eustoma
博客等级 码龄18年 79粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值