Android實(shí)現(xiàn)電池管理系統(tǒng)
一、Android 電池服務(wù)
Android電池服務(wù),用來(lái)監(jiān)聽(tīng)內(nèi)核上報(bào)的電池事件,并將最新的電池?cái)?shù)據(jù)上報(bào)給系統(tǒng),系統(tǒng)收到新數(shù)據(jù)后會(huì)去更新電池顯示狀態(tài)、剩余電量等信息。如果收到過(guò)溫報(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)聽(tīng)底層上報(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)聽(tīng)電池發(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)聽(tīng)內(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)聽(tīng)器,并將其注冊(cè)到Android的系統(tǒng)服務(wù)中
├── BatteryPropertiesRegistrar.h
二、Healthd
該模型向下監(jiān)聽(tīng)來(lái)自底層的電池事件,向上傳遞電池?cái)?shù)據(jù)信息給Framework層的BatteryService用來(lái)計(jì)算電池電量相關(guān)信息,
BatteryService通過(guò)傳遞來(lái)的數(shù)據(jù)來(lái)計(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)核主要通過(guò)get_property這個(gè)函數(shù)指針來(lái)獲得驅(qū)動(dòng)中的有關(guān)電池的信息,而這個(gè)函數(shù)在內(nèi)核中只給出了聲明,我們?cè)趯?xiě)驅(qū)動(dòng)的時(shí)候要自己實(shí)現(xiàn)這個(gè)函數(shù),即將自己寫(xiě)的函數(shù)賦值給這個(gè)函數(shù)指針,當(dāng)內(nèi)核需要驅(qū)動(dòng)中電源信息的時(shí)候就回調(diào)這個(gè)get_property函數(shù)。另外,我們寫(xiě)驅(qū)動(dòng)程序的時(shí)候又要給用戶(hù)提供接口,內(nèi)核中提供給用戶(hù)的接口就是sysfs,通過(guò)讀取sysfs文件系統(tǒng)中文件內(nèi)容,就可以得到電源的信息。內(nèi)核主要通過(guò)兩個(gè)文件power_supply_class.c和power_supply_core.c,我們調(diào)用其中的函數(shù)就可以把電源(電池,USB或AC)的信息展現(xiàn)給用戶(hù),有關(guān)電源的屬性寫(xiě)在/sys/class/powersupply文件夾下(此文件夾為程序運(yùn)行后所生成的)。
電池系統(tǒng)從底層向Framework層上報(bào)數(shù)據(jù)的流程:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
android中RecycleView添加下滑到底部的監(jiān)聽(tīng)示例
本篇文章主要介紹了android中RecycleView添加下滑到底部的監(jiān)聽(tīng)示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03Android Studio自動(dòng)提取控件Style樣式教程
這篇文章主要介紹了Android Studio自動(dòng)提取控件Style樣式教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Android框架Volley使用之Json請(qǐng)求實(shí)現(xiàn)
這篇文章主要介紹了Android框架Volley使用之Json請(qǐng)求實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05使用RecyclerView實(shí)現(xiàn)Item點(diǎn)擊事件
這篇文章主要介紹了使用RecyclerView實(shí)現(xiàn)Item點(diǎn)擊事件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08詳解Android Handler機(jī)制和Looper Handler Message關(guān)系
Handler是Android線程之間的消息機(jī)制,主要的作用是將一個(gè)任務(wù)切換到指定的線程中去執(zhí)行,準(zhǔn)確的說(shuō)是切換到構(gòu)成Handler的looper所在的線程中去出處理。本文將詳細(xì)介紹Android Handler機(jī)制和Looper Handler Message關(guān)系。2021-06-06簡(jiǎn)單實(shí)現(xiàn)Android滾動(dòng)公告欄
這篇文章主要為大家詳細(xì)介紹了如何簡(jiǎn)單實(shí)現(xiàn)Android滾動(dòng)公告欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Android仿京東淘寶自動(dòng)無(wú)限循環(huán)輪播控件思路詳解
在App的開(kāi)發(fā)中,很多的時(shí)候都需要實(shí)現(xiàn)類(lèi)似京東淘寶一樣的自動(dòng)無(wú)限輪播的廣告欄,這里小編寫(xiě)了一個(gè),分享到腳本之家平臺(tái)供大家參考2017-04-04