android5.1 setting之battery

本文參考下面博文
http://blog.csdn.net/bi511304183/article/details/9303073
http://blog.csdn.net/wangjinyu501/article/details/22077803

本次學習battery的緣由是因爲系統重啓後在setting裏沒有了battery這項功能。而明明外接有電池,卻不顯示。
一、android電源管理結構
Android中的電池使用方式主要有三種:AC、USB、Battery 等不同的模式。在應用程序層次,通常包括了電池狀態顯示的功能。因此從 Android 系統的軟件方面(包括驅動程序和用戶空間內容)需要在一定程度上獲得電池的狀態,電池系統主要負責電池信息統計、顯示。電池系統的架構如下所示:
這裏寫圖片描述
自下而上, Android 的電池系統分成以下幾個部分
1、驅動程序:
特定硬件平臺電池的驅動程序,用 Linux的Power Supply 驅動程序,實現向用戶空間提供信息。Battery 驅動程序需要通過sys文件系 統向用戶空間提供接口, sys文件系統的路徑是由上層的程序指定的。Linux標準的 Power Supply驅動程序 所使用的文件系統路徑爲:/sys/class/power_supply ,其中的每個子目錄表示一種能源供應設備的名稱。
這裏寫圖片描述

Linux中驅動程序:power_supply
這裏寫圖片描述
Linux 驅動 driver 維護着保存電池信息的一組文件 sysfs,供應用程序獲取電源相關狀態:

#define AC_ONLINE_PATH "/sys/class/power_supply/ac/online" AC 電源連接狀態   
#define USB_ONLINE_PATH "/sys/class/power_supply/usb/online" USB電源連接狀態   
#define BATTERY_STATUS_PATH "/sys/class/power_supply/battery/status"充電狀態   
#define BATTERY_HEALTH_PATH "/sys/class/power_supply/battery/health"電池狀態   
#define BATTERY_PRESENT_PATH "/sys/class/power_supply/battery/present"使用狀態   
#define BATTERY_CAPACITY_PATH "/sys/class/power_supply/battery/capacity"電池 level   
#define BATTERY_VOLTAGE_PATH "/sys/class/power_supply/battery/batt_vol"電池電壓   
#define BATTERY_TEMPERATURE_PATH "/sys/class/power_supply/battery/batt_temp"電池溫度   
#define BATTERY_TECHNOLOGY_PATH "/sys/class/power_supply/battery/technology"電池技術 當電池狀態發生變化時,driver 會更新這些文件。傳送信息到java 

2、本地代碼 - JNI

3 、JAVA 代碼
setting中battery的字符串出處:
代碼路徑:
android-5.1-m200-mr1/packages/apps/Settings/res/values/strings.xml
這裏寫圖片描述
顯示preference 的xml文件
android-5.1-m200-mr1/packages/apps/Settings/res/xml/power_usage_summary.xml
這裏寫圖片描述
加載preference 的xml文件
android-5.1-m200-mr1/packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java
這裏寫圖片描述

android-5.1-m200-mr1/packages/apps/Settings/res/xml/dashboard_categories.xml
這裏寫圖片描述

android-5.1-m200-mr1/packages/apps/Settings/src/com/android/settings/SettingsActivity.java
這裏寫圖片描述

判斷battery的present的值,如果爲false,則去掉battery這項功能
這裏寫圖片描述

接收廣播,解析廣播中的action,以及batteryPresent
這裏寫圖片描述

註冊接收ACTION_BATTERY_CHANGED廣播
這裏寫圖片描述

framework層的batteryservice發送ACTION_BATTERY_CHANGED廣播
frameworks/base/services/core/java/com/android/server/BatteryService.java

這裏寫圖片描述

二、Uevent部分
Uevent是內核通知android有狀態變化的一種方法,比如USB線插入、拔出,電池電量變化等等。其本質是內核發送(可以通過socket)一個字符串,應用層(android)接收並解釋該字符串,獲取相應信息。如下圖所示,如果其中有信息變化,uevent觸發,做出相應的數更新。

這裏寫圖片描述

adb shell進入android系統中執行dumpsys battery 可以顯示電池的信息
如圖所示:
這裏寫圖片描述

battery的驅動代碼
kernel-3.10.14/drivers/power/ricoh619-battery.c
這裏寫圖片描述

發佈了35 篇原創文章 · 獲贊 8 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章