Android实现电池管理系统

所属分类: 软件编程 / Android 阅读数: 36
收藏 0 赞 0 分享

一、Android 电池服务

Android电池服务,用来监听内核上报的电池事件,并将最新的电池数据上报给系统,系统收到新数据后会去更新电池显示状态、剩余电量等信息。如果收到过温报警和低电报警,系统会自动触发关机流程,保护电池和机器不受到危害。

Android电池服务的启动和运行流程:

Android

电池服务的源码结构

 Framework\base\services\java\com\android\server
        ├── SystemServer.java
                 创建BatteryServices、PowerManagerService、ActivityManagerService
        ├── BatterySevices.java
                 监听底层上报的battery事件,广播电池发生改变的消息
         Framework\base\services\java\com\android\server\am
        ├── ActivityManagerService.java
                 创建BatteryStatsService
        ├── BatteryStatsService.java
                 统计和记录电池参数的信息
         Framework\base\services\java\com\android\server\power
        ├── PowerManagerService.java
                 监听电池发生变化的广播消息,并调节系统的电源状态,例如亮屏
         Framework\base\core\java\com\internal\os\
        ├── BatteryStatsImpl.java
                 统计和记录电池参数的信息,并通知其他模块
         System\core\healthd
        ├── healthd.cpp
                 创建uevent socket,监听内核上报的内核事件
        ├── BatteryMonitor.cpp
                 初始化本地电池数据结构,将power_supply路径下属性节点路径填充进去,
        ├── BatteryMonitor.h
        ├── BatteryPropertiesRegistrar.cpp
                 创建电池属性监听器,并将其注册到Android的系统服务中
        ├── BatteryPropertiesRegistrar.h

二、Healthd

该模型向下监听来自底层的电池事件,向上传递电池数据信息给Framework层的BatteryService用来计算电池电量相关信息,
BatteryService通过传递来的数据来计算电池电量等信息,因此healthd在电池管理系统中起着承上启下的作用。

healthd的具体调用流程深入分析android5.1 healthd这篇文章讲得很清楚。

三、驱动

Android电源管理底层用的是Linux
 power_supply框架,内核提供给电池驱动的接口是结构体power_supply结构体。

struct power_supply { 
 const char *name; 
 enum power_supply_type type; 
 enum power_supply_property *properties; 
 size_t num_properties; 
 
 char **supplied_to; 
 size_t num_supplicants; 
 
 int (*get_property)(struct power_supply *psy, 
  enum power_supply_property psp, 
  union power_supply_propval *val); 
 int (*set_property)(struct power_supply *psy, 
  enum power_supply_property psp, 
  const union power_supply_propval *val); 
 int (*property_is_writeable)(struct power_supply *psy, 
   enum power_supply_property psp); 
 void (*external_power_changed)(struct power_supply *psy); 
 void (*set_charged)(struct power_supply *psy); 
 
 /* For APM emulation, think legacy userspace. */ 
 int use_for_apm; 
 
 /* Driver private data */ 
 void *drv_data;//add by bhj 
 
 /* private */ 
 struct device *dev; 
 struct work_struct changed_work; 
 spinlock_t changed_lock; 
 bool changed; 
 struct wake_lock work_wake_lock; 
 struct delayed_work deferred_register_work; 
 
#ifdef CONFIG_LEDS_TRIGGERS 
 struct led_trigger *charging_full_trig; 
 char *charging_full_trig_name; 
 struct led_trigger *charging_trig; 
 char *charging_trig_name; 
 struct led_trigger *full_trig; 
 char *full_trig_name; 
 struct led_trigger *online_trig; 
 char *online_trig_name; 
 struct led_trigger *charging_blink_full_solid_trig; 
 char *charging_blink_full_solid_trig_name; 
#endif 
};

内核主要通过get_property这个函数指针来获得驱动中的有关电池的信息,而这个函数在内核中只给出了声明,我们在写驱动的时候要自己实现这个函数,即将自己写的函数赋值给这个函数指针,当内核需要驱动中电源信息的时候就回调这个get_property函数。另外,我们写驱动程序的时候又要给用户提供接口,内核中提供给用户的接口就是sysfs,通过读取sysfs文件系统中文件内容,就可以得到电源的信息。内核主要通过两个文件power_supply_class.c和power_supply_core.c,我们调用其中的函数就可以把电源(电池,USB或AC)的信息展现给用户,有关电源的属性写在/sys/class/powersupply文件夹下(此文件夹为程序运行后所生成的)。

电池系统从底层向Framework层上报数据的流程:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android中加入名片扫描功能实例代码

这篇文章主要介绍了Android中加入名片扫描功能实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android仿微信发表说说实现拍照、多图上传功能

这篇文章主要为大家详细介绍了Android仿微信发表说说实现拍照、多图上传功能,使用Retrofit2.0技术,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

设置Android系统永不锁屏永不休眠的方法

在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠。本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删除设置中休眠时间选项,需要的朋友一起学习吧
收藏 0 赞 0 分享

Android Retrofit 2.0框架上传图片解决方案

这篇文章主要介绍了Android Retrofit 2.0框架上传一张与多张图片解决方案,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义等待对话框

这篇文章主要为大家详细介绍了Android自定义等待对话框的实现方法,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中Window添加View的底层原理

这篇文章主要介绍了Android中Window添加View的底层原理,需要的朋友可以参考下
收藏 0 赞 0 分享

Android调用系统默认浏览器访问的方法

这篇文章主要介绍了Android调用系统默认浏览器访问的方法的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发退出程序的方法汇总

Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗口B后,在B中如何关闭整个Android应用程序呢? 下面脚本之家小编就给大家介绍android开发退出程序的几种方法,感兴趣的朋友参考下吧
收藏 0 赞 0 分享

Android程序开发中单选按钮(RadioGroup)的使用详解

在android程序开发中,无论是单选按钮还是多选按钮都非常的常见,接下来通过本文给大家介绍Android程序开发中单选按钮(RadioGroup)的使用,需要的朋友参考下吧
收藏 0 赞 0 分享

Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中

这篇文章主要介绍了Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多