三 Android O WiFi 电量(功耗)统计

文章目录

    • 流程图
    • 关键环节代码

流程图

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

本文以设备进入待机模式后,wifi 设置为关闭场景的进行分析,
其他的场景(分析flow类似,后面有时间补上):

  1. wifi 保存连接网络,进入待机 (wifi 不扫描,只有wlan 的fw逻辑处理与AP Router 的Ps-poll
  2. 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 耗电。

以上场景涉及到模块流程图如下
三 Android O WiFi 电量(功耗)统计_第1张图片

关键环节代码

一、对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统计会发现
后者进入耗电统计之后(再也没退出 ) 三 Android O WiFi 电量(功耗)统计_第2张图片
前者当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 耗电时间的统计。

三 Android O WiFi 电量(功耗)统计_第3张图片
三 Android O WiFi 电量(功耗)统计_第4张图片三 Android O WiFi 电量(功耗)统计_第5张图片

你可能感兴趣的:(Android,架构)