优麒麟电源管理浅析

  1. 1. 数据来源
  2. 2. DBus和GObjec共同的作用

最近有研发小哥哥的加持,软文高频产出,目的是能让大家更深入的了解和使用我们的优麒麟操作系统,本期为大家介绍的是优麒麟电源管理工具。

在优麒麟系统的桌面应用中,电源管理工具(ukui-power-manager)能够监听系统事件和用户偏好设置,用来设置电源选项和屏保选项,比如设置显示器空闲多久进入睡眠和屏保采用的界面,同时还提供了显示电源相关的属性,功率,充放电统计等功能。相比台式机,笔记本电脑增加了电池相关的属性收集和显示,笔记本上的应用界面如图1。


图1 ukui-power-manager显示界面

ukui-power-manager主要包括了三个部分:

数据来源

这些界面的内容并不复杂,值得一探究竟的是界面上显示元素的数据来源。当笔记本接上电源电池开始充电,ukui-power-manager的界面能够显示充满电时间。我们就从这个time_to_full值获取的入口出发,来理解整个显示元素的数据来源。这个值是通过一个名称为gpm_stats_update_info_page_details的函数内部调用g_object_get函数获取的。g_object_get则是GObject提供的一个函数。

ukui-power-manager只是一个前端显示程序,在它后面存在一个程序,提供了诸如充放电时间这样的数据。这个后端程序就是upower,在upower中用来计算time_to_full的公式如下:

time_to_full = 3600 * ((energy_full - energy) / energy_rate);

不难理解,公式意思是满时的能量减去当前能量,得到的差值除以功率,再把结果转换成秒单位。那么这几个新引入的变量又从哪里获取的?满时能量按常理在运行时是不会改变的,功率可能有大有小,变化应该也不大。当前能量是通过sysfs_get_double这个函数的返回值获得,在这个函数内部打开了一个文件,然后从文件里获取到了数据。这个文件是由内核进行写操作的。至此,找到了界面上数据time_to_full的源头。

DBus和GObjec共同的作用

图2 DBus和GObject层次

1)基本概念

DBus是一种进程间进行通信的机制,在桌面程序中大量地应用。它主要的概念就是总线,开发者注册进程到总线,然后就可以通过方法和信号进行通信。DBus底层是socket机制,提供了更高一层的接口,更方便了程序之间进行数据交换。GObject 是GTK+的一个程序库,提供使用 C 语言编写面向对象程序的方法。

2)作用

现在来看一看前端ukui-power-manager和upower的具体源代码,发现都使用了DBus这种通信框架。要想完全理解DBus又是一个不小的专题,这里只是管中窥豹,了解一些基本的用法。d-feet是一个非常有用的工具,可以查看系统里所有的DBus连接。终端敲入命令d-feet,可以看到有一个系统Bus叫做org.freedesktop.UPower,还可以看到一个会话Bus叫做org.ukui.PowerManager。于是这两个程序就可以通过Bus连接进行数据通信。

图3 d-feet查看Bus通信

打开d-feet界面的org.ukui.PowerManager这个Bus连接,找到它提供的接口org.ukui.PowerManager.Backlight。找到方法SetBrightness并双击弹出输入参数界面,如下图所示,简单的输入79,点击运行发现屏幕背光亮度发生了调整。通过这种简单的方式,调用了DBus服务端提供的一个方法,把亮度调节到了79的百分比。

图4 d-feet中运行方法

以上就是对优麒麟电源管理工具和使用的编程技术的一些简单分析,希望可以给初次接触优麒麟桌面的读者带来一点感性认识,欢迎大家进一步探究具体实现的详细过程。