Android 电池管理系统

来源:互联网 发布:淘宝店铺介绍范文大全 编辑:程序博客网 时间:2024/04/30 05:02

一、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结构体。

[cpp] view plain copy
  1. struct power_supply {  
  2.     const char *name;  
  3.     enum power_supply_type type;  
  4.     enum power_supply_property *properties;  
  5.     size_t num_properties;  
  6.   
  7.     char **supplied_to;  
  8.     size_t num_supplicants;  
  9.   
  10.     int (*get_property)(struct power_supply *psy,  
  11.                 enum power_supply_property psp,  
  12.                 union power_supply_propval *val);  
  13.     int (*set_property)(struct power_supply *psy,  
  14.                 enum power_supply_property psp,  
  15.                 const union power_supply_propval *val);  
  16.     int (*property_is_writeable)(struct power_supply *psy,  
  17.                      enum power_supply_property psp);  
  18.     void (*external_power_changed)(struct power_supply *psy);  
  19.     void (*set_charged)(struct power_supply *psy);  
  20.   
  21.     /* For APM emulation, think legacy userspace. */  
  22.     int use_for_apm;  
  23.       
  24.     /* Driver private data */  
  25.     void *drv_data;//add by bhj  
  26.   
  27.     /* private */  
  28.     struct device *dev;  
  29.     struct work_struct changed_work;  
  30.     spinlock_t changed_lock;  
  31.     bool changed;  
  32.     struct wake_lock work_wake_lock;  
  33.     struct delayed_work deferred_register_work;  
  34.   
  35. #ifdef CONFIG_LEDS_TRIGGERS  
  36.     struct led_trigger *charging_full_trig;  
  37.     char *charging_full_trig_name;  
  38.     struct led_trigger *charging_trig;  
  39.     char *charging_trig_name;  
  40.     struct led_trigger *full_trig;  
  41.     char *full_trig_name;  
  42.     struct led_trigger *online_trig;  
  43.     char *online_trig_name;  
  44.     struct led_trigger *charging_blink_full_solid_trig;  
  45.     char *charging_blink_full_solid_trig_name;  
  46. #endif  
  47. };</span>  
 内核主要通过get_property这个函数指针来获得驱动中的有关电池的信息,而这个函数在内核中只给出了声明,我们在写驱动的

时候要自己实现这个函数,即将自己写的函数赋值给这个函数指针,当内核需要驱动中电源信息的时候就回调这个get_property函数

。另外,我们写驱动程序的时候又要给用户提供接口,内核中提供给用户的接口就是sysfs,通过读取sysfs文件系统中文件内容,就

可以得到电源的信息。内核主要通过两个文件power_supply_class.c和power_supply_core.c,我们调用其中的函数就可以把电源(电

池,USB或AC)的信息展现给用户,有关电源的属性写在/sys/class/powersupply文件夹下(此文件夹为程序运行后所生成的)。

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


转自 http://blog.csdn.net/bhj1119/article/details/52947344


0 0
原创粉丝点击