Android的电池的管理分为三个部分:Java部分,JNI部分以及kenel部分。


1.Java部分主要是BatteryService,作为电池及充电相关的服务,它的主要功能就是监听power_supplyuenvnt事件,读取sysfs中电池信息,然后通过intent广播给所有相关Activity

源代码路径如下:

android_froyo/frameworks/base/services/java/com/android/server/BatteryService.java

BatteryService中实现了一个UEvent的观察者。ueventLinux内核用来向用户空间主动上报事件的机制,对于JAVA程序来说,只实现UEventObserver的虚函数onUEvent,然后注册即可。

privateUEventObserver mUEventObserver = new UEventObserver() {
@Override
public void onUEvent(UEventObserver.UEvent event) {
update();
}
};
这里只关注power_supply的事件:
mUEventObserver.startObserving("SUBSYSTEM=power_supply");
当有power_supply相关的事件上报时,就会调用update函数。
update
先调用native_updatesysfs中读取相关状态。

update然后根据读到的状态更新BatteryService的成员变量,并广播一个Intent来通知其它关注电源状态的组件。

private final void sendIntent() {
// Pack up the values and broadcast them toeveryone
Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
try {
mBatteryStats.setOnBattery(mPlugType == BATTERY_PLUGGED_NONE,mBatteryLevel);
} catch (RemoteException e) {
// Should never happen.
}
int icon = getIcon(mBatteryLevel);
intent.putExtra("status", mBatteryStatus);
intent.putExtra("health", mBatteryHealth);
intent.putExtra("present", mBatteryPresent);
intent.putExtra("level", mBatteryLevel);

...........
ActivityManagerNative.broadcastStickyIntent(intent, null);
}


2.JNI部分提供接口给上层的 battery_service.java 调用,直接读取设备文件,取得信息后,用来更新battery状态。源代码路径如下:

android_froyo/frameworks/base/services/jni/com_android_server_BatteryService.cpp

com_android_server_BatteryService.cpp中主要实现了android_server_BatteryService_update函数,即Java层的BatteryService中调用的native_update函数,它直接读取设备文件。

static void android_server_BatteryService_update(JNIEnv* env,jobject obj)

{

setBooleanField(env, obj, gPaths.acOnlinePath,gFieldIds.mAcOnline);

...............

const int SIZE = 128;

char buf[SIZE];

if(readFromFile(gPaths.batteryStatusPath, buf, SIZE) >0)

env->SetIntField(obj, gFieldIds.mBatteryStatus,getBatteryStatus(buf));

else

env->SetIntField(obj,gFieldIds.mBatteryStatus,

gConstants.statusUnknown);

if(readFromFile(gPaths.batteryHealthPath, buf, SIZE) >0)

env->SetIntField(obj, gFieldIds.mBatteryHealth,getBatteryHealth(buf));


if(readFromFile(gPaths.batteryTechnologyPath, buf, SIZE)> 0)

env->SetObjectField(obj,gFieldIds.mBatteryTechnology,env->NewStringUTF(buf));

}

static JNINativeMethod sMethods[] = {

{"native_update", "()V",(void*)android_server_BatteryService_update},

};


3.kernel部分又可分为两部分:power_supply_core以及具体芯片的battery driver

power_supply_core部分的源代码路径:

trunk/android_froyo/kernel/common/drivers/power/power_supply_core.c
trunk/android_froyo/kernel/common/drivers/power/power_supply_sysfs.c

battery driver(bq27541)部分的源代码路径:

android_froyo/kernel/common/drivers/power/bq27x00_battery.c

power_supply_core主要提供统一设备文件的创建以及发送power_supply相关的ueventbattery driver主要提供具体的电池信息。

bq27541电池芯片为例,首先要注册i2c驱动,在zylonite_pxa300.c文件中声明bq27541芯片的type以及i2c地址,使用i2c_add_driver(&bq27x00_battery_driver)注册驱动时会调用bq27x00_battery_probe函数,该函数中完成i2c设备的探测,充放电中断的申请以及设备文件的创建。

每当产生充放电中断时,驱动会调用中断函数ext_power_isr,该函数调用power_supply_corepower_supply_changed(&(di->bat))函数,发送一个power_supply属性的ueventJava层的BatteryService接收到该事件后就会调用JNI层的native_update函数来获得电池信息,然后通过intent广播给相应的activity

由于电池电量变化时不能产生中断来通知上层读取电池信息,所以设置了一个定时器,每隔30s发送一个uevent事件让BatteryService来读取电池信息是否有变化。


更多相关文章

  1. Android(安卓)Camera从App层到framework层到HAL层的初始化过程
  2. Android(安卓)SurfaceFlinger 学习之路(五)----VSync 工作原理
  3. EP28-DownloadManager分析(1)
  4. Android视图加载流程(3)之ViewRootImpl的UI刷新机制
  5. Android(安卓)8.1移植:针对某个APK做到wifi和gprs分别做到允许和
  6. Android(安卓)内存溢出(Out Of Memory)
  7. Android(安卓)P wakeup 亮屏流程
  8. 004. Android界面刷新没有调用OnMeasure
  9. 【攻克Android(安卓)(43)】WebView (网络视图)

随机推荐

  1. Android train——ListView绑定ArrayAdap
  2. 在Android(安卓)Studio下执行高德搜索你
  3. 杀掉指定进程
  4. Android判断包名和类名是否存在的方法
  5. 一网打尽Android UI 控件教程
  6. Linux-Ubuntu 18.04 LTS 安装 Oracle Vir
  7. android studio中res文件夹下的文件显示
  8. Android应用程序级全局变量Application
  9. Android(安卓)控件架构
  10. android Preference之android:dependency