Android實現(xiàn)電池管理系統(tǒng)
一、Android 電池服務(wù)
Android電池服務(wù),用來監(jiān)聽內(nèi)核上報的電池事件,并將最新的電池數(shù)據(jù)上報給系統(tǒng),系統(tǒng)收到新數(shù)據(jù)后會去更新電池顯示狀態(tài)、剩余電量等信息。如果收到過溫報警和低電報警,系統(tǒng)會自動觸發(fā)關(guān)機流程,保護(hù)電池和機器不受到危害。
Android電池服務(wù)的啟動和運行流程:
Android
電池服務(wù)的源碼結(jié)構(gòu)
Framework\base\services\java\com\android\server
├── SystemServer.java
創(chuàng)建BatteryServices、PowerManagerService、ActivityManagerService
├── BatterySevices.java
監(jiān)聽底層上報的battery事件,廣播電池發(fā)生改變的消息
Framework\base\services\java\com\android\server\am
├── ActivityManagerService.java
創(chuàng)建BatteryStatsService
├── BatteryStatsService.java
統(tǒng)計和記錄電池參數(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)計和記錄電池參數(shù)的信息,并通知其他模塊
System\core\healthd
├── healthd.cpp
創(chuàng)建uevent socket,監(jiān)聽內(nèi)核上報的內(nèi)核事件
├── BatteryMonitor.cpp
初始化本地電池數(shù)據(jù)結(jié)構(gòu),將power_supply路徑下屬性節(jié)點路徑填充進(jìn)去,
├── BatteryMonitor.h
├── BatteryPropertiesRegistrar.cpp
創(chuàng)建電池屬性監(jiān)聽器,并將其注冊到Android的系統(tǒng)服務(wù)中
├── BatteryPropertiesRegistrar.h
二、Healthd
該模型向下監(jiān)聽來自底層的電池事件,向上傳遞電池數(shù)據(jù)信息給Framework層的BatteryService用來計算電池電量相關(guān)信息,
BatteryService通過傳遞來的數(shù)據(jù)來計算電池電量等信息,因此healthd在電池管理系統(tǒng)中起著承上啟下的作用。

healthd的具體調(diào)用流程深入分析android5.1 healthd這篇文章講得很清楚。
三、驅(qū)動
Android電源管理底層用的是Linux
power_supply框架,內(nèi)核提供給電池驅(qū)動的接口是結(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這個函數(shù)指針來獲得驅(qū)動中的有關(guān)電池的信息,而這個函數(shù)在內(nèi)核中只給出了聲明,我們在寫驅(qū)動的時候要自己實現(xiàn)這個函數(shù),即將自己寫的函數(shù)賦值給這個函數(shù)指針,當(dāng)內(nèi)核需要驅(qū)動中電源信息的時候就回調(diào)這個get_property函數(shù)。另外,我們寫驅(qū)動程序的時候又要給用戶提供接口,內(nèi)核中提供給用戶的接口就是sysfs,通過讀取sysfs文件系統(tǒng)中文件內(nèi)容,就可以得到電源的信息。內(nèi)核主要通過兩個文件power_supply_class.c和power_supply_core.c,我們調(diào)用其中的函數(shù)就可以把電源(電池,USB或AC)的信息展現(xiàn)給用戶,有關(guān)電源的屬性寫在/sys/class/powersupply文件夾下(此文件夾為程序運行后所生成的)。
電池系統(tǒng)從底層向Framework層上報數(shù)據(jù)的流程:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android自定義view仿微信刷新旋轉(zhuǎn)小風(fēng)車
這篇文章主要介紹了Android自定義view仿微信刷新旋轉(zhuǎn)小風(fēng)車,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
Android實現(xiàn)聊天記錄上傳本地服務(wù)器(即時通訊)
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)聊天記錄上傳本地服務(wù)器,即時通訊功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06
Android使用TextView,設(shè)置onClick屬性無效的解決方法
下面小編就為大家?guī)硪黄狝ndroid使用TextView,設(shè)置onClick屬性無效的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
Android實現(xiàn)動態(tài)添加標(biāo)簽及其點擊事件
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)動態(tài)添加標(biāo)簽及其點擊事件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12

