wifi功耗高 android,三 Android O WiFi 电量(功耗)统计

文章目录

流程图

关键环节代码

流程图

秉承简单(提纲挈领)分享(交流)技术精神,本文尽力做到简化(凝练)关键环节以及流程。

本文以设备进入待机模式后,wifi 设置为关闭场景的进行分析,

其他的场景(分析flow类似,后面有时间补上):

wifi 保存连接网络,进入待机 (wifi 不扫描,只有wlan 的fw逻辑处理与AP Router 的Ps-poll )

wifi 开启且无保存任何网络,进入待机(wifi 会以固定周期进行nlo/pno scan )

wifi 以disable状态进入 stand by之后,为保证设备唤醒之后能快速启用wifi 网络,在stand by的mode下会在后台进行scan,周期性识别周围存在的网络。

其耗电统计flow主要有以下:

一、由WifiStateMachine 的ScanModeState触发的耗电统计

a. 由WifiStateMachine的状态机ScanModeState 触发给 WiFiStateTracker上报自己已开始Scan State,

b. WiFiStateTracker 进一步将统计状请求report 给到BatteryStatsService,

c. BatteryStatsService 收到请求后,开始对wifiStateTimer进行耗电时间统计。

二、继承WifiStateMachine 的ScanMode 触发到 WifiScanningService 的Scan 耗电统计

a. 一旦进入Scan时,将直接上报给BatteryStatsService 统计wifiScanTimer 耗电,

b. 一旦退出Scan时,将上报BatteryStatsService 结束wifiScanTimer 耗电。

以上场景涉及到模块流程图如下

25ad62e4587d144660f47e7a6969824e.png

关键环节代码

一、对mWifiStateTimer进行耗电统计

a. WifiStateMachine.java 中 给WifiStateTracker 上报进入Scan State

class ScanModeState extends State {

private int mLastOperationMode;

@Override

public void enter() {

mLastOperationMode = mOperationalMode;

mWifiStateTracker.updateState(WifiStateTracker.SCAN_MODE); // report ScanState to WifiStateTracker

}

b. WifiStateTracker.java

public void updateState(int state){

....

informWifiStateBatteryStats(reportState); // report 状态给 BatteryStatsService

}

c. BatteryService.java + BatteryStatsImpl.java

public void noteWifiState(int wifiState, String accessPoint) {

...

mStats.noteWifiStateLocked(wifiState, accessPoint); // 跳转到BatteryStatsImpl 开启真正的wifiState 耗电统计

}

public void noteWifiStateLocked(int wifiState, String accessPoint) {

....

//开启对mWifiStateTimer 进行耗电统计,此项将在dumpsys batterystats 中的Wifi Statistics那一栏里面体现

mWifiStateTimer[wifiState].startRunningLocked(elapsedRealtime);

}

二、对mWifiScanTimer进行耗电统计

a. WifiScanningServiceImpl.java

class ScanningState extends State {

....

public void enter() {

...

//向BatteryStatsService上报开启Scaning 耗电统计请求

mBatteryStats.noteWifiScanStartedFromSource(mScanWorkSource);

}

....

// wifi 退出scanning 时,上报BatteryStatsService 停止wifi耗电统计

public void exit(){

....

mBatteryStats.noteWifiScanStoppedFromSource(mScanWorkSource);

}

}

b. BatteryService.java + BatteryStatsImpl.java

public void noteWifiScanStartedFromSource(WorkSource ws){

....

//开启对mWifiScanTimer进行耗电统计,此项将在dumpsys batterystats 中的Wifi Statistics那一栏里面体现

mStats.noteWifiScanStartedFromSourceLocked(ws);

}

// BatteryStatsImpl.java

public void noteWifiScanStartedFromSourceLocked(WorkSource ws){

.....

for (int i=0; i

耗电统计 Wifi Statistics , 如下

对比,发现一项有意思几点

a. wifi scaning 15h 100% !!

b. wifi 耗电80.0mA

c. wifi scan 耗时在1m左右 (这里明显的与a点矛盾)

问题,为何会出现上面的矛盾现象??

细心的你重点关注上面mWifiScanTimer 与 mWifiStateTimer统计会发现

后者进入耗电统计之后(再也没退出 ) 2d9ae370f6e213820e88952bd9064362.png

前者当wifiScanning Stop之后会上报给BatteryStatsService 停止Scaning 耗电统计,

这就造成了a与c点矛盾地方,既是wifiState 在开始进入统计scaning 耗电时间之后,再也没退出来(即使wifi 没有进行scanning ,但BatteryStatsService 仍然继续统计wifi scanning 的耗电,这就造成了 wifi 关闭下进入待机之后 耗电高达80.9mA 之高)。

framework 这里需要调整wifi scanning 耗电统计的逻辑,既是在wifi 完成scanning之后,及时上报BatteryStatsService 自己已stop scanning 了,以更准确停止对wifi scanning 耗电时间的统计。

502a5752beacd48995acc65d67d789bd.png

29c0b5259b35458a0f9cc7da49eb7547.pnga45dce4ff5a7c646d7ac138a3cf3e874.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值