一、Sensor功耗问题分类

目前所遇到的sensor功耗问题主要包括以下几类:
待机功耗:

  • SSC子系统异常,导致系统无法进入AOSD
  • SSC子系统异常,导致频繁唤醒AP
  • SSC子系统的GPIO/PMIC配置错误,导致系统存在漏电

运行功耗:

  • SSC子系统的sensor工作模式异常,导致系统功耗增大
  • Android上层服务未正常关闭sensorservice,导致系统功耗增大

在sensor功耗问题的分析中,sensor自身工作行为所产生的耗电是非常小的,大多数功耗问题都是由SSC(Snapdragon Sensor Core)子系统异常或是Android上层服务异常调用sensorservice引起。

二、Sensor功耗问题分析方法

不同类型的sensor功耗问题有不同的分析方法,以下是一些通用的针对各类型sensor功耗问题的分析.

SSC子系统引起系统无法进入AOSD问题分析:

1.首先要确认系统待机时的是否是SSC子系统无法进入sleep而导致系统无法进入AOSD,可通过以下命令查看各个子系统的sleep count:
命令:

adb shell cat /sys/power/rpmh_stats/master_stats

输出如下:

APSS
Version:0x1
Sleep Count:0x2bf90
Sleep Last Entered At:0x48e7ec7af00
Sleep Last Exited At:0x48e7ecfe85e
Sleep Accumulated Duration:0x42b29deb96a
ADSP
Version:0x1
Sleep Count:0xf17
Sleep Last Entered At:0x48a16986465
Sleep Last Exited At:0x48a16980931
Sleep Accumulated Duration:0x487a6e075f7
CDSP
Version:0x1
Sleep Count:0x55
Sleep Last Entered At:0x1f39e3aadeb
Sleep Last Exited At:0x1f39e3a6d3b
Sleep Accumulated Duration:0x48e5fed220c
SLPI
Version:0x1
Sleep Count:0x1e341a
Sleep Last Entered At:0x48e7ed80b48
Sleep Last Exited At:0x48e7ed76c90
Sleep Accumulated Duration:0x473b8551197

其中子系统每进入sleep一次,相应的sleep count就会+1,如果某个subsystem的sleep count长时间没有增加,基本可断定该子系统无法进入sleep

2.接下来确认是否为sensor的使用导致SSC子系统异常,可用以下方法disable AP子系统与SSC子系统的通信来确认:
命令:

adb shell mv /vendor/lib64/libssc.so /vendor/lib64/libssc.so.bk
adb shell mv /vendor/lib/libssc.so /vendor/lib/libssc.so.bk
adb shell sync
adb reboot

3.若确认SSC异常与sensor使用无关,则请sensor team帮忙分析SSC无法进入LPM的原因
4.若确认SSC异常与sensor使用有关,则用如下命令确认系统灭屏时有哪些sensor正在被使用
命令:

adb shell dumpsys sensorservice

5.逐一关闭灭屏时正在使用的sensor,来找出引起SSC异常的sensor
6.关闭引起SSC异常的sensor,并使用如下命令验证该异常是SSC子系统自身引起,还是上层的sensor服务引起:

adb shell
自研校准 -d <simple_time_ms> <SensorName> & //校准的工具的使用

7.将结果反馈给sensor team进行进一步分析

SSC子系统频繁唤醒AP问题分析方法

1.分析待机时的bugreport日志,通过以下log确认SSC子系统存在多次唤醒AP:

All wakeup reasons:
Wakeup reason Abort:Last active Wakeup Source: SensorService_wakelock, handle processSensorService: 16m 50s 349ms (1025 times)
realtime
Wakeup reason Abort:Wakeup IRQ detected during suspend: 103qcom,glink-smem-native-xprt-dsps: 2m 7s 108ms (126 times) realtime

2.确认是否为sensor的使用导致SSC子系统异常,可用以下方法disable AP子系统与SSC子系统的通信来确认:
命令:

adb shell mv /vendor/lib64/libssc.so/vendor/lib64/libssc.so.bk
adb shell mv /vendor/lib/libssc.so/vendor/lib/libssc.so.bk
adb shell sync
adb reboot

3.若AP频繁唤醒是由sensor使用引起的,则通过以下命令找出系统灭屏时正在使用的sensor,并通过排除法来确定引起AP唤醒的sensor
命令:

adb shell dumpsys sensorservice

4.检查是否为上层服务将sensor错误配置成了Wakeup模式,导致AP不断被唤醒,如:

Connection Number: 4
Operating Mode: NORMAL
com.qualcomm.qti.internal.telephony.DynamicSarController | WakeLockRefCount 0 | uid 1001 | cache size 0 | max cache size 0
sar_detector Non-wakeup 0x0000001e | status: active | pending flush events 0
SAR ADUX1050 Wakeup0x00000025 | status: active | pending flush events 0
Hall Effect Sensor 0x00000034 | status: active | pending flush events 0

在以上log中,由于modem服务将SAR sensor异常设置成了Wakeup模式,导致SAR sensor每隔1s就会频繁唤醒AP

5.若上层服务的sensor配置没有问题,但系统还是存在频繁的AP唤醒,就需要sensor team检查是否为SSC子系统在使用sensor时出现异常,导致AP频繁唤醒。

如:之前遇到的安装微信及QQ后,系统会频繁上报SSC中断,导致AP无法睡眠,经分析是由于微信及QQ同时使用了Non-wakeup pedometer,导致大量sensor中断产生。
但其本质原因是由于SensorHub问题导致Non-wakeup sensor会异常唤醒AP。

SSC子系统的GPIO/PMIC配置错误导致系统漏电问题分析方法

1.分析GPIO/PMIC的漏电问题是在系统已经成功进入AOSD以后,此时各个子系统都已成功进入sleep,故很难从各subsystem看出问题

2.这时最简单的办法就是通过Trace32来dump系统进入AOSD之前的GPIO/PMIC状态,检查各GPIO/PMIC是否存在漏电

3.但有时由于条件所限在无法使用Trace32工具的情况下,就需要对比出问题前后的两个版本,从regression的角度来找出漏电

SSC子系统的sensor工作模式异常,导致系统功耗增大问题分析方法

1.sensor的工作模式异常导致的功耗问题主要出现在系统运行时,指可以使用interrupt mode的sensor被SSC子系统异常配置成了polling mode,导致功耗增大

2.分析方法主要是先通过dumpsys sensorservice找出系统使用了哪些sensor?再检查哪些sensor可以被配置成interrupt mode

3.若确认相应sensor可以工作在interrupt mode,却异常配成了polling mode,则找sensor team帮忙修正

功耗优化之Sensor功耗分析的更多相关文章

  1. iOS--App功耗优化

    良好的用户体验需要如下要素: 电池寿命长.随着能效降低,电池寿命也会降低.但用户想让自己的移动设备全天候待命. 速度快.iOS系统处理复杂操作时仍能提供很好的性能. 响应快.同一时刻消耗太多资源会使U ...

  2. 移动智能设备功耗优化系列--前言(NVIDIA资深project师分享)

    本文是嵌入式企鹅圈原创团队成员.NVIDIA资深开发project师Terry发表的第一篇文章,其将对"移动智能设备功耗优化"这个专题展开一个系列的总结分享. Terry毫无保留地 ...

  3. Python 优化第一步: 性能分析实践 使用cporfile+gprof2dot可视化

    拿来主义: python -m cProfile -o profile.pstats to_profile.py gprof2dot -f pstats profile.pstats |dot -Tp ...

  4. MySQL 性能优化神器 Explain 使用分析

    简介 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化. EXPLAIN 命令用法十分简单, 在 ...

  5. 【官网翻译】性能篇(四)为电池寿命做优化——使用Battery Historian分析电源使用情况

    前言 本文翻译自“为电池寿命做优化”系列文档中的其中一篇,用于介绍如何使用Battery Historian分析电源使用情况. 中国版官网原文地址为:https://developer.android ...

  6. mysql优化:慢查询分析、索引配置优化

    一.优化概述二.查询与索引优化分析a.性能瓶颈定位show命令慢查询日志explain分析查询profiling分析查询b.索引及查询优化三.配置优化 max_connections back_log ...

  7. golang gc 优化思路以及实例分析

    一个即将上线的go 写的高频服务,压测的时候发现 gc 特别高,高到10%-15% 左右了,本文记录下优化 gc 的过程和和思路.线上环境1.10. 首先,查看gc 是否有异常,我们可以使用 gctr ...

  8. 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)

    http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...

  9. mysql优化----explain的列分析

    sql语句优化: : sql语句的时间花在哪儿? 答: 等待时间 , 执行时间. 等待时间:看是不是被锁住了,那就不是语句层面了是服务端层面了,看连接数内存. 执行时间:到底取出多少行,一次性取出1万 ...

随机推荐

  1. 访问控制protected是不同包中对子类可见,什么意思?

    2.2 以下例子说明:protected是不同包中对子类可见,对非子类不可见. 例1.2.2.a:---本例为正常用法. package p1;public class A {    protecte ...

  2. Android点击按钮退出程序并提醒

    效果展示: MainActivity.java import androidx.appcompat.app.AppCompatActivity; import android.app.AlertDia ...

  3. 微信小程序下拉加载和上拉刷新两种实现方法

    方法一:onPullDownRefresh和onReachBottom方法实现小程序下拉加载和上拉刷新 首先要在json文件里设置window属性 设置js里onPullDownRefresh和onR ...

  4. 技术管理进阶——什么Leader值得追随?

    原创不易,求分享.求一键三连 ​Leader眼里的主动性 前几天孙狗下面小A身上发生了一件Case,让他感到很疑惑: 有一个跨部门较多的项目推进不力,于是善于交流的他被临时提拔成项目负责人,但马上令人 ...

  5. 超星尔雅看课刷题小tips

    用chrom浏览器,先安装扩展程序Tampermonkey BETA 然后进入> https://greasyfork.org/zh-CN 找一款适合自己的脚本安装即可刷课.

  6. Python paho-mqtt使用心得

    一.概述 一)基本概念 使用回调处理从MQTT代理返回的数据,要使用回调需要先定义回调函数然后将其指派给客户端实例(client). 例如: # 定义一个回调函数 def on_connect(cli ...

  7. ABP应用开发(Step by Step)-上篇

    本文主要通过逐步构建一个CRUD示例程序来介绍 ABP 框架的基础知识.它涉及到应用开发的多个方面.在本章结束时,您将了解ABP 框架的基本开发方式.建议入门人员学习,老手不要浪费您宝贵时间.  创建 ...

  8. vue build 指定环境

    前言 其实很简单的东西,搜索时很是费劲,特此记录下来.网上有很多资料,但都是五花八门,特此记录 使用 项目根目录中创建环境变量使用文件 .env #所有环境都会加载 .env.development ...

  9. C++基础-6-继承

    6. 继承 1 #include<iostream> 2 using namespace std; 3 4 5 class Base { 6 public: 7 Base() { 8 m_ ...

  10. latex中显示代码

    如何在latex中添加代码模块 首先在开头导入以下的包 \usepackage{listings} \usepackage{ctex} % 用来设置附录中代码的样式 \lstset{ basicsty ...