摘要
待机功耗中联网目前已知的盲点:App自己都不知道的push类型的被动联网、app下载场景所需时长、组播联网、路由器打醒AP。
竞品 | 策略 |
华为 | 灭屏使用handler定时检测(若灭屏30分钟内则周期1分钟,否则为2分钟),检测应用流量的大小变化(UidTxBytes+UidRxBytes),当检测到应用流量速率大于8kb/s && 非下载场景则计为1次后台联网, 若灭屏检测到联网次数大于30次,则上报联网异常大数据 备注:也是无法知道联网事件的时间和次数分布 |
xxx公司 | 1.基于AppProcessWakeup进行统计待机唤醒Ap的应用次数, 超过9次上报联网大数据和统计到日志文件中 2.在电池电量变化或待机场景,统计uid对应的数据和wifi流量的上传和下载大小到本地日志文件中 3.WiFi模块:设备休眠时kernel添加监控唤醒AP的联网日志 |
备注:如果是wifi联网可以使用WiFi模块提供的工具分析发生时的时间和次数情况,可以解决上述盲点,但是数据联网就没有单独工具了哈。
源码流程图
// 加载 powergenie_native3.so
static {
NativeAdapter.mNativeAvailabe = true;
try {
System.loadLibrary("powergenie_native3");
}
catch(UnsatisfiedLinkError v0) {
System.err.println("WARNING: Could not load libpowergenie_native3.so");
NativeAdapter.mNativeAvailabe = false;
}
}
/**
* 获取进程上传和下载的流量数据
* v1.mUidBytes.put(v5_1, Long.valueOf(v14_1));
if(this.isDownloadStateDbg()) {
v1.mUidTxBytes.put(v5_1, Long.valueOf(v68));
v1.mUidRxBytes.put(v5_1, Long.valueOf(v66));
v1.mUidTxPackets.put(v5_1, Long.valueOf(v64));
v1.mUidRxPackets.put(v5_1, Long.valueOf(v62));
}
*/
public static long[] updateTrafficStats() {
if(NativeAdapter.mNativeAvailabe) {
return NativeAdapter.nativeUpdateTrafficStats();
}
return null;
}
/* 流量大于8 kb/s,记一次联网次数 */
public void updateDlUlNetTrafficCount(long j, long j2, int i) {
if (j > 0 && j2 > 0 && i > 0) {
long j3 = (j2 * 1000) / j;
if (j3 >= 8192) {
this.mTotalDlUlTrafficCount += i;
Log.i("AppPowerRecord", this.mAppName + " dl or upload speed: " + j3 + "bytes/s, traffic count:" + i + ", duration:" + (j / 1000));
}
}
}
// type 9 流量次数:3次, 30次,60次
static {
mAppPowerTable = new int[]{40, 20, 4};
mCurrentLevelTable = new int[]{100, 50, 5};
mPowerTypeCurrent = new PowerTypeCurrent();
mPowerLevelTable = new int[][]{
new int[]{POWER_TYPE_ALARM, 3, 12, 40}, // type 1
new int[]{POWER_TYPE_GPS, 10, 300, 600}, // type 2
new int[]{POWER_TYPE_SENSOR, 10, 300, 600}, // type 3
new int[]{POWER_TYPE_WAKELOCK, 10, 300, 600}, // type 4
new int[]{POWER_TYPE_AUTOSTART, 3, 20, 40}, // type 6
new int[]{POWER_TYPE_WIFI_SCAN, 10, 180, 360}, // type 7
new int[]{POWER_TYPE_BT_SCAN, 10, 300, 600}, // type 8
new int[]{POWER_TYPE_NET_TRAFFIC, 3, 30, 60}, // type 9
new int[]{POWER_TYPE_CPU_HIGH_LOAD, 0, 300, 600}, // type 10
new int[]{POWER_TYPE_BLOCK_SCREEN_TIMEOUT, 0, 180, 600}, // type 11, 超时0秒,超时180秒,,超时600秒
new int[]{POWER_TYPE_NET_LOCATION, 180, 1800, 3600}// type 12
};
}