Android Battery 在framework相关介绍

本文介绍了Android系统中BatteryService的工作原理,从BatteryService的启动、JNI接口的使用到电池状态信息的读取和更新。详细讲解了如何通过UEventObserver监听电池变化,并通过Intent传递电池状态给应用。同时,解释了BatteryStatus和BatteryHealth的各种状态及其含义。
部署运行你感兴趣的模型镜像
 前言:本文主要讲解了battery中如何读取sys中的一些电池相关的数据,然后发送给上层的内容。也会对某些数据节点进行拓展讲解。

 

1.      BatteryService.java(frameworks\base\services\java\com\android\server)   

BatteryService是在系统启动的时候就跑起来的,(通过SystemServer.java可以看出)


电池的信息是实时的变化的,那如何能实时的更新电池的信息呢,

BatteryService会通过UEventObserver启动一个onEventThread

并会在构造函数中启动UEventObserver

mUEventObserver.startObserving("SUBSYSTEM=power_supply");

         启动之后就不会停止,


        

         然后会调用update()来更新电池的信息

         Update()通过JNI来com_android_server_BatteryService.cpp(frameworks\base\services\jni)   读取数据,BatteryService通过JNI注册不仅是函数还有变量。

 

2.      com_android_server_BatteryService.cpp(frameworks\base\services\jni)

在此函数中对status,healths,technology进行了读取



那还有其他的数据呢,是从哪里读取的呢,下面看一下

register_android_server_BatteryService()


 

3.      register_android_server_BatteryService()(frameworks\base\services\jni)

此函数是在libandroid_servers.so被载入的时候,通过调用JNI_OnLoad()来调用的,


在此也可以看BatteryService需要的数据

(1). mAcOline  电源是连接方式是AC

(2). mUsbOnline 电源的连接方式是USB

(3). mBatteryStatus

(4). mBatteryHealth

(5). mBatteryPresent

(6). mBatteryLevel   电量的等级

(7). mBatteryTechnology  电池类型

(8). mBatteryVoltage    电压

(9).mBatteryTemperature  温度

 

BatteryStatus有5个状态,分别是:

public static final int BATTERY_STATUS_UNKNOWN = 1;

public static final int BATTERY_STATUS_CHARGING = 2;

public static final int BATTERY_STATUS_DISCHARGING =3;

public static final int BATTERY_STATUS_NOT_CHARGING =4;

public static final intBATTERY_STATUS_FULL = 5;

 

BatteryHealth有6个状态,分别是:

    public static final int BATTERY_HEALTH_UNKNOWN= 1;

    public static final intBATTERY_HEALTH_GOOD = 2;

    public static final intBATTERY_HEALTH_OVERHEAT = 3;

    public static final intBATTERY_HEALTH_DEAD = 4;

    public static final intBATTERY_HEALTH_OVER_VOLTAGE = 5;

    public static final intBATTERY_HEALTH_UNSPECIFIED_FAILURE = 6;

 

4.      BatteryService是如何把数据传出去的

BatteryService通过Intent把数据传出去


说明:

mPlugType是链接的电源方式0 means it is on battery, other constants are different typesof power sources.)

BATTERY_SCALE 是电池的最大level

Icon  integercontaining the resource ID of a small status bar icon indicating the current batterystate.

 

将所有的数据封装到Intent中,然后通过

ActivityManagerNative.broadcastStickyIntent(intent,null);

传出去。

 

 

5.      应用如何接收数据

应用如果想要接收到BatteryService发送出来的电池信息,则需要注册一个Intent为

Intent.ACTION_BATTERY_CHANGED的BroadcastReceiver

注册方法如下:

IntentFiltermIntentFilter = new IntentFilter();

mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);

registerReceiver(mIntentReciver,mIntentFilter);

privateBroadcastReceiver mIntentReceiver = new BroadcastReceiver(){

@Override

Public voidonReceive(Context context, Intent intent){
           //TODO Auto-generated methodstub

           String action = intent.getAction();

           If(action.equals(Intent.ACTION_BATTERY_CHANGED)){

                    int nVoltaget =intent.getIntExtra(“voltage”,0);

                    if(nVoltage!=0){

                             mVoltage.setText(“v:”+ nVoltage + “mV-Success…”);

                    }

                    Else{
                             mVoltage.setText(“V:“+nVoltage+”mV-fall…”);

                    }

           }

 }

}


          


您可能感兴趣的与本文相关的镜像

Qwen-Image

Qwen-Image

图片生成
Qwen

Qwen-Image是阿里云通义千问团队于2025年8月发布的亿参数图像生成基础模型,其最大亮点是强大的复杂文本渲染和精确图像编辑能力,能够生成包含多行、段落级中英文文本的高保真图像

Android Framework层进行功耗优化,主要涉及对系统组件的管理、资源调度、后台进程控制以及与硬件交互的优化。以下是几种常见的优化方法和实践: ### 1. 优化WakeLock使用 WakeLock是Android中用于保持CPU或屏幕运行的机制。不当使用WakeLock会导致设备在休眠状态下仍然保持高功耗。优化策略包括: - 避免长时间持有部分唤醒锁(Partial WakeLock),确保在任务完成后及时释放。 - 使用`Handler`或`AlarmManager`控制任务执行时间,避免不必要的唤醒。 - 使用`JobScheduler`或`WorkManager`将非紧急任务延迟到设备充电或连接Wi-Fi时执行。 ### 2. 控制后台进程和服务 后台进程和服务是Android系统中耗电的重要因素。优化方法包括: - 限制应用在后台启动服务的能力,使用`ForegroundService`替代普通服务,并提供明确的用户通知。 - 使用`ActivityManager`限制后台进程数量,及时清理不活跃的进程。 - 启用Doze模式和App Standby,限制处于非活跃状态的应用访问网络和执行后台任务。 ### 3. 优化网络请求 网络通信是功耗较高的操作之一。优化方法包括: - 合并多个小请求为一个大请求,减少唤醒无线电模块的次数。 - 使用高效的网络协议(如HTTP/2、QUIC)减少连接建立时间。 - 缓存数据,避免重复请求,减少无线电信号搜索和连接时间。 ### 4. 优化传感器和硬件使用 传感器和硬件(如GPS、蓝牙、摄像头等)的使用会显著影响电池寿命。优化方法包括: - 在不使用传感器时及时关闭,避免持续监听。 - 使用低功耗传感器模式,如低功耗加速度计或陀螺仪。 - 合理设置传感器采样频率,避免过高频率导致额外功耗。 ### 5. 优化屏幕显示 屏幕是设备中最大的耗电组件之一。优化方法包括: - 根据环境光线自动调节屏幕亮度,使用`AutoBrightnessController`进行管理。 - 缩短屏幕超时时间,避免屏幕长时间保持亮起。 - 对于需要保持屏幕常亮的应用(如视频播放器),使用`WakeLock`时应谨慎,并在不需要时及时释放。 ### 6. 使用BatteryStats进行功耗分析 BatteryStats是Android系统中用于记录设备功耗的工具。通过BatteryStats可以: - 分析各组件的耗电情况,识别高功耗模块。 - 监控WakeLock、网络、GPS等资源的使用情况。 - 结合电源配置文件(Power Profile)估算不同组件的电流消耗。 ### 7. 优化系统调度 Android Framework层的调度策略也会影响功耗。优化方法包括: - 使用`SchedulingPolicyService`优化线程优先级,避免高优先级线程频繁唤醒CPU。 - 使用`ThermalService`监控设备温度,防止过热导致的额外功耗。 - 启用CPU频率调节策略(如Interactive或Schedutil),根据负载动态调整CPU频率。 ### 8. 优化广播接收器 广播接收器的不当使用可能导致不必要的唤醒。优化方法包括: - 避免注册过多的静态广播接收器,优先使用动态注册。 - 使用`LocalBroadcastManager`进行本地广播通信,减少跨进程通信开销。 - 合理使用`JobScheduler`或`WorkManager`替代广播触发的后台任务。 ### 9. 优化图形渲染 图形渲染是影响功耗的重要因素。优化方法包括: - 减少UI层级,降低GPU渲染负载。 - 使用`Choreographer`优化动画帧率,避免过度渲染。 - 启用GPU渲染分析工具(如`adb shell dumpsys gfxinfo`)识别渲染瓶颈。 ### 示例代码:使用WorkManager执行后台任务 ```java WorkManager workManager = WorkManager.getInstance(context); // 创建一个周期性任务 PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(MyWorker.class, 1, TimeUnit.HOURS) .setConstraints(new Constraints.Builder() .setRequiresCharging(true) .setRequiredNetworkType(NetworkType.CONNECTED) .build()) .build(); // 提交任务 workManager.enqueue(workRequest); ``` ### 示例代码:释放WakeLock ```java PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag"); // 获取WakeLock wakeLock.acquire(10 * 60 * 1000L); // 持有10分钟 // 释放WakeLock if (wakeLock.isHeld()) { wakeLock.release(); } ``` ### 示例代码:获取BatteryStats数据 ```java BatteryManager batteryManager = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE); BatteryStats batteryStats = batteryManager.getBatteryStats(); // 获取设备总运行时间 long uptime = batteryStats.getUptime(SystemClock.elapsedRealtime()); // 获取各个组件的耗电情况 Map<String, BatteryStats.Uid> uidStats = batteryStats.getUidStats(); for (BatteryStats.Uid uid : uidStats.values()) { long wakeLockTime = uid.getWakeLockTime(0, BatteryStats.STATS_SINCE_CHARGED); Log.d("BatteryStats", "UID: " + uid.getUid() + " WakeLock Time: " + wakeLockTime); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值