文章目录
流程图
关键环节代码
流程图
秉承简单(提纲挈领)分享(交流)技术精神,本文尽力做到简化(凝练)关键环节以及流程。
本文以设备进入待机模式后,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 耗电。
以上场景涉及到模块流程图如下
关键环节代码
一、对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统计会发现
后者进入耗电统计之后(再也没退出 )
前者当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 耗电时间的统计。