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

首頁 > 系統 > Android > 正文

Android實現電池管理系統

2019-10-22 18:17:09
字體:
來源:轉載
供稿:網友

一、Android 電池服務

Android電池服務,用來監聽內核上報的電池事件,并將最新的電池數據上報給系統,系統收到新數據后會去更新電池顯示狀態、剩余電量等信息。如果收到過溫報警和低電報警,系統會自動觸發關機流程,保護電池和機器不受到危害。

Android電池服務的啟動和運行流程:

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在電池管理系統中起著承上啟下的作用。

Android,電池管理系統,Android管理系統,Android電池管理

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管理系統,Android電池管理

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平谷区| 武胜县| 高要市| 马公市| 柘城县| 榆树市| 巴东县| 天气| 广德县| 东源县| 苍溪县| 绥德县| 武威市| 互助| 永登县| 平凉市| 紫金县| 特克斯县| 施秉县| 裕民县| 东城区| 玛纳斯县| 松潘县| 泰安市| 北安市| 道真| 贡嘎县| 崇文区| 赤壁市| 闵行区| 怀安县| 通海县| 从江县| 丽水市| 尼木县| 咸丰县| 仁寿县| 大田县| 昭苏县| 佳木斯市| 宝丰县|