#夏日挑战赛#OpenHarmony源码解析之开关机流程分析 原创 精华
深开鸿
发布于 2022-7-29 14:17
浏览
3收藏
本文正在参加星光计划3.0–夏日挑战赛
作者:严明舟
本文以OpenHarmony 3.1 Release - powermgr_power_manager源码为基础进行分析。
1 简介
电源管理服务组件是OpenHarmony电源管理子系统的一个组件,主要负责如下功能:
- 系统关机
- 重启设备
- 检测当前设备的亮灭屏状态
- 查询系统是否支持该类型的锁
- 创建RunningLock锁
- 锁定和持有RunningLock锁
- 释放RunningLock锁
- 查询当前RunningLock锁是持有状态,还是释放状态
- 系统休眠和唤醒以及屏幕开关
本文主要分析开关机功能,包括NAPI接口以及功能实现的整个流程。
图1 电源管理子系统架构图
图2 电源管理服务组件架构图
2 电源管理服务组件代码目录
3 开关机整体流程
流程描述:
- JavaScript应用调用shutdownDevice执行系统关机功能;
- shutdownDevice调用power.cpp注册的NAPI接口ShutdownDevice,ShutdownDevice接口进一步调用NAPI封装的RebootOrShutdown方法,RebootOrShutdown会根据true或false参数,决定是调用PowerMgrClient的系统关机ShutDownDevice方法还是重启设备RebootDevice方法;
- ShutDownDevice首先会调用Connect方法,Connect会通过GetSystemAbilityManager方法获取SystemAbilityManager实例,然后通过CheckSystemAbility方法检查对应的SA是否存在,并返回remoteObject对象,最后通过iface_cast构造proxy对象,此时创建了PowerMgrProxy实例,最后ShutDownDevice调用PowerMgrProxy的ShutDownDevice方法;
- 电源管理服务代理请求端PowerMgrProxy的ShutDownDevice方法调用SendRequest方法向电源管理服务提供端PowerMgrStub发送系统关机请求;
- 电源管理服务提供端PowerMgrStub接收到系统关机请求后,调用ShutDownDeviceStub方法;
- PowerMgrService继承PowerMgrStub的ShutDownDeviceStub方法,并进一步调用PowerMgrService的ShutDownDevice方法;
- ShutDownDevice首先判断是否持有系统APP的uid权限,以及是否持有"ohos.permission.REBOOT"的权限,随后执行ShutdownService的Shutdown方法;
- Shutdown方法进一步执行ShutdownService的RebootOrShutdown方法,根据true或false决定是执行Reboot或Shutdown;
- 在Shutdown方法中会通过系统调用方法DoReboot执行shutdown命令;
日志
3.1 电源管理服务注册
- 调用System Ability的MakeAndRegisterAbility接口注册Power Manager Service实例
- System Ability调用Power Manager Service的OnStart函数实现电源管理服务组件的启动
- PowerMgrService的初始化
3.2 开关机NAPI接口定义及实现
- NAPI接口声明
- NAPI接口实现,NAPI接口shutdownDevice会进一步调用NAPI封装的RebootOrShutdown方法,RebootOrShutdown会根据true或false参数,决定是调用PowerMgrClient的系统关机ShutDownDevice方法还是重启设备RebootDevice方法
3.3 开关机客户端native实现
- ShutDownDevice首先会调用Connect方法,Connect会通过GetSystemAbilityManager方法获取SystemAbilityManager实例,然后通过CheckSystemAbility方法检查对应的SA是否存在,并返回remoteObject对象,最后通过iface_cast构造proxy对象,此时创建了PowerMgrProxy实例
- 最后ShutDownDevice将开关机请求委托给电源管理服务代理PowerMgrProxy的ShutDownDevice方法去处理
3.4 开关机代理端实现
PowerMgrProxy对象会将开关机的请求以IPC方式发送给电源管理服务提供端PowerMgrStub对象处理
3.5 开关机服务提供端实现
- 服务提供端(Stub),继承IRemoteStub,实现业务函数,重写OnRemoteRequest()方法用于接收客户端请求
- 通过消息码匹配对应的业务函数,并调用,这里匹配的是ShutDownDeviceStub
- 服务提供端stub将开关机的请求转发给子类对象PowerMgrService的ShutDownDevice方法去处理,在ShutDownDevice方法中会判断相关的权限,以及调用ShutdownService对象的Shutdown方法
3.6 ShutdownService对象的Shutdown方法实现
- Shutdown进一步调用RebootOrShutdown方法,RebootOrShutdown根据true或false决定是执行系统关机Shutdown还是重启设备Reboot
3.7 电源管理action实现
执行系统调用,进行shutdown操作
4 应用demo
总结
本文主要和大家分享了OpenHarmony电源管理子系统中开关机功能的实现细节,对NAPI接口、电源管理服务请求端及电源管理服务提供端流程等,做了较为详细的代码说明,希望通过本文您能初步掌握电源管理子系统的关键功能和核心流程。关于OpenHarmony其它子系统的分析,请关注后续文章。
更多原创内容请关注:深开鸿技术团队
入门到精通、技巧到案例,系统化分享OpenHarmony开发技术,欢迎投稿和订阅,让我们一起携手前行共建生态。
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
已于2022-11-10 15:40:55修改
赞
4
收藏 3
回复
4
2
3
相关推荐
老师图1好像挂掉了,方便补一下吗?
实现关机重启的话好像会有很多权限问题,博主大大能讲一下吗