1沒寫節點文件,常見屬性
sys/class/power_supply
2沒寫注冊過程
batteryproperties Binder 服務的特色:
- 能夠在java和C++之間傳遞對象(BatteryProperties對象)
- 服務能夠主動給客戶端發送消息
一、電池電量從healthd傳到Java層的通信過程
C++:
system/core/healthd/healthd.cpp
,
system/core/healthd/BatteryMonitor.cpp
,
framework/native/services/batteryservice/include/batteryservice/IBatteryPropertiesListener.h
framework/native/services/batteryservice/IBatteryPropertiesListener.cpp
framework/native/services/batteryservice/include/batteryservice/IBatteryPropertiesRegistrar.h
system/core/healthd/BatteryPropertiesRegistor.cpp
,
framework/native/services/batteryservice/include/batteryservice/IBatteryPropertiesRegistrar.h
framework/native/services/batteryservice/IBatteryPropertiesRegistrar.cpp
framework/base/core/java/android/os/IBatteryPropertiesListener.aidl
Java:
BatteryService, BatteryListener, IBatteryPropertiesListener.aidl, IBatteryPropertiesRegistrar.aidl,
BatteryState,BatteryStatesService(這兩個跟AMS相關,記錄更新應用耗電信息,暫未分析)
healthd進程除了讀取電池數據上報外,還有關機充電時繪制圖標的功能
先來張圖對Battery模塊有個整體認知
流程圖:
Battery框架的AIDL,java層和c層的交互
batteryproperties Binder服務
定義:
/frameworks/native/include/batteryservice/IBatteryPropertiesRegistrar.h
接口:
IBatteryPropertiesRegistrar
33class IBatteryPropertiesRegistrar : public IInterface {
34public:
35 DECLARE_META_INTERFACE(BatteryPropertiesRegistrar)
36
37 virtual void registerListener(const sp<IBatteryPropertiesListener>& listener) = 0;
38 virtual void unregisterListener(const sp<IBatteryPropertiesListener>& listener) = 0;
39 virtual status_t getProperty(int id, struct BatteryProperty *val) = 0;
40 virtual void scheduleUpdate() = 0;
41};
實現:
BnBatteryPropertiesRegistrar
/system/core/healthd/BatteryPropertiesRegistrar.cpp
sub 接口2:
IBatteryPoroertiesListener
C++語言定義的接口
/frameworks/native/include/batteryservice/IBatteryPropertiesListener.h
34class IBatteryPropertiesListener : public IInterface {
35public:
36 DECLARE_META_INTERFACE(BatteryPropertiesListener)
37
38 virtual void batteryPropertiesChanged(struct BatteryProperties props) = 0;
39};
java定義的接口(利用了AIDL)
/frameworks/base/core/java/android/os/IBatteryPropertiesListener.aidl
package android.os;
import android.os.BatteryProperties;
oneway interface IBatteryPropertiesListener {
void batteryPropertiesChanged(in BatteryProperties props);
}
others :BatteryProperties類是如何在java和C++傳輸的
/frameworks/base/core/java/android/os/BatteryProperties.java 和 BatteryProperties.aidl
/frameworks/native/services/batteryservice/BatteryProperties.cpp
兩個保持一致,并且可序列化
參考資料:
(原創)android6.0系統Healthd深入分析
https://blog.csdn.net/u011311586/article/details/51082685
android 4.4 電池電量管理底層分析(C\C++層)
https://blog.csdn.net/daweibalang717/article/details/41446993
android 4.4 電池電量顯示分析(低電量提醒與電池圖標)Java 層
https://blog.csdn.net/daweibalang717/article/details/40615453
其他方面:
Android7.0BatteryStatsService[https://blog.csdn.net/gaugamela/article/details/52931949 ]
Android7.0BatteryService[https://blog.csdn.net/Gaugamela/article/details/52920222 ]
Android battery historian功耗分析之環境搭建[ http://www.lxweimin.com/p/5abd53abcc1e ]