国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android實(shí)現(xiàn)電池管理系統(tǒng)

2019-12-12 01:18:49
字體:
供稿:網(wǎng)友

一、Android 電池服務(wù)

Android電池服務(wù),用來監(jiān)聽內(nèi)核上報(bào)的電池事件,并將最新的電池?cái)?shù)據(jù)上報(bào)給系統(tǒng),系統(tǒng)收到新數(shù)據(jù)后會(huì)去更新電池顯示狀態(tài)、剩余電量等信息。如果收到過溫報(bào)警和低電報(bào)警,系統(tǒng)會(huì)自動(dòng)觸發(fā)關(guān)機(jī)流程,保護(hù)電池和機(jī)器不受到危害。

Android電池服務(wù)的啟動(dòng)和運(yùn)行流程:

Android

電池服務(wù)的源碼結(jié)構(gòu)

 Framework/base/services/java/com/android/server
        ├── SystemServer.java
                 創(chuàng)建BatteryServices、PowerManagerService、ActivityManagerService
        ├── BatterySevices.java
                 監(jiān)聽底層上報(bào)的battery事件,廣播電池發(fā)生改變的消息
         Framework/base/services/java/com/android/server/am
        ├── ActivityManagerService.java
                 創(chuàng)建BatteryStatsService
        ├── BatteryStatsService.java
                 統(tǒng)計(jì)和記錄電池參數(shù)的信息
         Framework/base/services/java/com/android/server/power
        ├── PowerManagerService.java
                 監(jiān)聽電池發(fā)生變化的廣播消息,并調(diào)節(jié)系統(tǒng)的電源狀態(tài),例如亮屏
         Framework/base/core/java/com/internal/os/
        ├── BatteryStatsImpl.java
                 統(tǒng)計(jì)和記錄電池參數(shù)的信息,并通知其他模塊
         System/core/healthd
        ├── healthd.cpp
                 創(chuàng)建uevent socket,監(jiān)聽內(nèi)核上報(bào)的內(nèi)核事件
        ├── BatteryMonitor.cpp
                 初始化本地電池?cái)?shù)據(jù)結(jié)構(gòu),將power_supply路徑下屬性節(jié)點(diǎn)路徑填充進(jìn)去,
        ├── BatteryMonitor.h
        ├── BatteryPropertiesRegistrar.cpp
                 創(chuàng)建電池屬性監(jiān)聽器,并將其注冊(cè)到Android的系統(tǒng)服務(wù)中
        ├── BatteryPropertiesRegistrar.h

二、Healthd

該模型向下監(jiān)聽來自底層的電池事件,向上傳遞電池?cái)?shù)據(jù)信息給Framework層的BatteryService用來計(jì)算電池電量相關(guān)信息,
BatteryService通過傳遞來的數(shù)據(jù)來計(jì)算電池電量等信息,因此healthd在電池管理系統(tǒng)中起著承上啟下的作用。

healthd的具體調(diào)用流程深入分析android5.1 healthd這篇文章講得很清楚。

三、驅(qū)動(dòng)

Android電源管理底層用的是Linux
 power_supply框架,內(nèi)核提供給電池驅(qū)動(dòng)的接口是結(jié)構(gòu)體power_supply結(jié)構(gòu)體。

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 };

內(nèi)核主要通過get_property這個(gè)函數(shù)指針來獲得驅(qū)動(dòng)中的有關(guān)電池的信息,而這個(gè)函數(shù)在內(nèi)核中只給出了聲明,我們?cè)趯戲?qū)動(dòng)的時(shí)候要自己實(shí)現(xiàn)這個(gè)函數(shù),即將自己寫的函數(shù)賦值給這個(gè)函數(shù)指針,當(dāng)內(nèi)核需要驅(qū)動(dòng)中電源信息的時(shí)候就回調(diào)這個(gè)get_property函數(shù)。另外,我們寫驅(qū)動(dòng)程序的時(shí)候又要給用戶提供接口,內(nèi)核中提供給用戶的接口就是sysfs,通過讀取sysfs文件系統(tǒng)中文件內(nèi)容,就可以得到電源的信息。內(nèi)核主要通過兩個(gè)文件power_supply_class.c和power_supply_core.c,我們調(diào)用其中的函數(shù)就可以把電源(電池,USB或AC)的信息展現(xiàn)給用戶,有關(guān)電源的屬性寫在/sys/class/powersupply文件夾下(此文件夾為程序運(yùn)行后所生成的)。

電池系統(tǒng)從底層向Framework層上報(bào)數(shù)據(jù)的流程:

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 桐城市| 谢通门县| 云霄县| 美姑县| 加查县| 曲麻莱县| 辉南县| 巍山| 芜湖市| 柳州市| 江安县| 来宾市| 云霄县| 嘉义市| 鲜城| 蕉岭县| 安陆市| 延寿县| 沙湾县| 海丰县| 康马县| 额尔古纳市| 石狮市| 双流县| 玛曲县| 喀喇| 育儿| 迁安市| 沿河| 武定县| 湘阴县| 保康县| 东海县| 开江县| 嘉鱼县| 依安县| 湖南省| 双柏县| 库尔勒市| 齐齐哈尔市| 合江县|