华为 Sensor 省电策略调研

华为EMUI 9.0.0.187(C00E57R1P15) 无该功能

华为EMUI 9.1.0.321(C00E320R1P1) 之后有sensor管控

一、华为 Sensor 省电策略

1. Sensor 类别只配置非唤醒类Sensor

2. 手机静止情况,应用不可见时达到1分钟,则禁止应用使用Sensor

3. 应用被识别计步场景时,使用SENSOR_DELAY_UI或SENSOR_DELAY_NORMAL采样,则允许不可见时使用Sensor

4. 应用被识别计步场景时,使用SENSOR_DELAY_GAME或SENSOR_DELAY_FASTEST采样,则禁止不可见时使用Sensor

5. 一旦处于可见状态,立刻恢复Sensor的正常使用

二、华为 Sensor 省电现象

自己写一个Sensor Demo PhoneData.apk进行调研,主要功能点:

1. 持 PARTIAL_WAKE_LOCK

2. 不停监听Sensor数据变化

机器

PhoneData.apk 使用 non wake-up sensor 采集数据

华为

1.亮屏+应用可见,有数据; 2. 亮屏+应用不可见+1分钟内,无数据; 3. 灭屏+应用不可见+1分钟内,无数据; 4. 亮屏+应用不可见+不停摇一摇+SENSOR_DELAY_FASTEST,无数据 5. 灭屏+应用不可见+不停摇一摇+SENSOR_DELAY_FASTEST,无数据 6. 亮屏+应用不可见+不停摇一摇+SENSOR_DELAY_GAME,无数据 7. 灭屏+应用不可见+不停摇一摇+SENSOR_DELAY_GAME,无数据 8. 亮屏+应用不可见+不停摇一摇+SENSOR_DELAY_UI ,有数据 9. 灭屏+应用不可见+不停摇一摇+SENSOR_DELAY_UI ,有数据 10. 亮屏+应用不可见+不停摇一摇+SENSOR_DELAY_NORMAL,有数据,一旦检测为计步应用,即使静止也有数据 11. 灭屏+应用不可见+不停摇一摇+SENSOR_DELAY_NORMAL,有数据,,一旦检测为计步应用,即使静止也有数据

TOne

1.亮屏+应用可见,有数据 2.亮屏+后台+至少10分钟以上,有数据 3.灭屏+后台+至少10分钟以上,有数据

上述发现如下:

华为

只有非唤醒类Sensor

不可见+静止 禁止使用Sensor

采样率为SENSOR_DELAY_UI或SENSOR_DELAY_NORMAL,且被识别为计步,则允许使用Sensor,否则禁止

TOne

唤醒类Sensor 非唤醒类Sensor

没有限制

没有限制

三、Sensor 省电的详细分析

1、 Sensor 列表区别

1.1 华为

​​​​​​​

SensorType: 1, Name: accelerometer-lsm6dsm, Description: {Sensor name="accelerometer-lsm6dsm", vendor="st", version=1, type=1, maxRange=78.4532, resolution=9.576806E-6, power=0.23, minDelay=2000}只有非唤醒类Sensor,代码中使用SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER, true/*表示唤醒类*/),会没有任何数据输出

1.2 TOne

SensorType: 1, Name: lsm6ds3c Accelerometer Wakeup, Description: {Sensor name="lsm6ds3c Accelerometer Wakeup", vendor="STMicro", version=140549, type=1, maxRange=78.4532, resolution=0.0023928226, power=0.15, minDelay=2404}SensorType: 1, Name: lsm6ds3c Accelerometer Non-wakeup, Description: {Sensor name="lsm6ds3c Accelerometer Non-wakeup", vendor="STMicro", version=140549, type=1, maxRange=78.4532, resolution=0.0023928226, power=0.15, minDelay=2404}

2、华为-不可见+静止,则禁止使用Sensor​​​​​​​

// 非重要通知识别2019-08-14 13:30:25.376 2134-2458/? I/hibernation: com.xiaomi.hm.health skips not important notification// 拦截com.xiaomi.hm.health使用Sensor2019-08-14 13:30:25.376 2134-2458/? I/APwPowerPolicy: ignore sensor about not never opt app: com.xiaomi.hm.health// 冻结 com.xiaomi.hm.health2019-08-14 13:30:25.398 2134-2458/? I/hibernation: Freeze com.xiaomi.hm.health OK !2019-08-14 13:30:25.404 2134-2458/? I/hibernation: close sockets >> com.xiaomi.hm.health, uids : [10311]// 统计 com.xiaomi.hm.health,sensor: 0.09mAh, time: 527s2019-08-14 13:30:25.855 2134-2247/? I/APwFeedback3: delta rank, uid: 10311, name: com.xiaomi.hm.health, current: 5mA, total: 0.17mAh. [cpu: 0.08mAh, time: 4s], [sensor: 0.09mAh, time: 527s]// 识别无声音、无计步行为2019-08-14 13:30:25.868 2134-2247/? I/AppActAnalyzer: Pedometer pkg: com.xiaomi.hm.health, big current: 5, recent no sound, count step

3、SENSOR_DELAY_GAME或SENSOR_DELAY_FASTEST,即使计步,也禁止使用Sensor​​​​​​​

5      /**56       * Typical sensor delay (sample period) in microseconds.57       */58      // Fastest sampling, system will bound it to minDelay59      static constexpr int32_t SENSOR_DELAY_FASTEST = 0;60      // Typical sample period for game, 50Hz; 即1秒中打印50次,Sensor数据变化61      static constexpr int32_t SENSOR_DELAY_GAME = 20000;62      // Typical sample period for UI, 15Hz ; 即1秒中打印15次,Sensor数据变化63      static constexpr int32_t SENSOR_DELAY_UI = 66667;64      // Default sensor sample period,即1秒中打印5次,Sensor数据变化65      static constexpr int32_t SENSOR_DELAY_NORMAL = 200000;

相关日志如下:

​​​​​​​

// sensor: 0.06mAh, time: 344s2019-08-14 13:46:27.092 2134-2247/? I/APwFeedback5: delta rank, uid: 10309, name: com.fadi.phonedata, current: 7mA, total: 0.24mAh. [cpu: 0.18mAh, time: 9s], [sensor: 0.06mAh, time: 344s]//被识别为高耗电应用:常驻通知属性,华为日志太少,实测app确实无法监听Sensor数据了2019-08-14 13:46:27.105 2134-2247/? I/AppHighCurrentAnalyzer: has persist notification, add 5 threashold, pkg: com.fadi.phonedata

4、应用可见时恢复使用Sensor

// 可见时恢复2019-08-14 13:58:55.094 2134-2458/? I/ash_trans: com.fadi.phonedata { hibernation duration=86168 Uptime=86168 } transition to: running reason:visible2019-08-14 13:58:55.098 2134-2247/? I/AppsUsage: scnOff:false FgAPP:com.fadi.phonedata BgAPP:com.huawei.android.launcher2019-08-14 13:58:55.114 2134-2458/? I/PGServer: report state:6 event type:2 pid:0 uid:10309 pkg:com.fadi.phonedata to pid: 12522019-08-14 13:58:55.114 2134-2458/? I/hibernation: Unfreeze com.fadi.phonedata OK !2019-08-14 13:58:55.115 1252-2796/? I/PGManagerService: proxyBroadcast:[com.fadi.phonedata] proxy:false2019-08-14 13:58:55.167 2134-2458/? I/hibernation: unproxy com.fadi.phonedata broadcast OK !2019-08-14 13:58:55.169 2134-2458/? I/hibernation: Unpending com.fadi.phonedata alarm OK !2019-08-14 13:58:55.197 2134-2458/? I/hibernation: unproxy gps:com.fadi.phonedata,uid:10309,result:true2019-08-14 13:58:55.198 2134-2458/? I/hibernation: above launcher front pkgs: [com.fadi.phonedata]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web实操9——session

概念 数据保存在服务器HttpSession对象里。 session也是域对象,有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据: 获取session获取数据: 请求存储: 请求获取: 数据正常打印&#xff1a…

Unity的四种数据持久化方式

目录 什么是数据持久化 数据持久化之PlayerPrefs 概述 API及用法 电脑中存放的位置 优缺点 主要用处 封装PlayerPrefs 数据持久化之XML XML是什么 读取XML信息 C#读取XML的方法有几种 读取xml文件信息 读取元素和属性信息 总结 写入XML信息 选择存储目录 存储…

面向对象分析和设计OOA/D,UML,GRASP

目录 什么是分析和设计? 什么是面向对象的分析和设计? 迭代开发 UML 用例图 交互图 基于职责驱动设计 GRASP 常见设计原则 什么是分析和设计? 分析,强调是对问题和需求的调查研究,不是解决方案。例如&#x…

Nginx:限流限速

1. 什么是限流限速? 限流限速是Nginx运维中一个非常重要的功能,用于防止服务器过载和保护资源免受滥用。它可以通过限制客户端的请求速率或上传/下载速度来实现。 限流:控制单位时间内允许处理的请求数量。这有助于防止过多的并发请求导致服务器性能下降或崩溃。限速:限制…

探索 JMeter While Controller:循环测试的奇妙世界

嘿,宝子们!今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器,它就像是一把神奇的钥匙,能帮我们打开循环测试的大门,模拟出各种各样复杂又有趣的场景哦! 一、While 控制器初印象 想象一下,你…

迈向AGI,3、2、1,2025上链接!

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 往期精彩文章推荐 关于AI TIME AI TIME源起于2019年,旨在发扬科学思辨精神,邀请各界人士对人工智能理论、算法和场景应用的本质问题进行探索,加强思想碰撞,链接全…

JVM对象内存分配

1 栈上分配 栈空间随着方法执行完毕而回收通过栈上分配对象内存空间的方式,减少对堆空间的使用,从而减少gc的压力,提升程序性能 逃逸分析:分析对象的作用域,判断对象所需内存是否可以在栈上分配当对象没有被外部方法或…

计算机网络--路由器问题

一、路由器问题 1.计算下一跳 计算机网络--根据IP地址和路由表计算下一跳-CSDN博客 2.更新路由表 计算机网络--路由表的更新-CSDN博客 3.根据题目要求给出路由表 4.路由器收到某个分组,解释这个分组是如何被转发的 5.转发分组之路由器的选择 二、举个例子 …

vue 项目集成 electron 和 electron 打包及环境配置

vue electron 开发桌面端应用 安装 electron npm i electron -D记得加上-D,electron 需添加到devDependencies,如果添加到dependencies后面运行可能会报错 根目录创建electron文件夹,在electron文件夹创建main.js(或者backgrou…

VMware镜像站加速下载,省去下载等待时间

CDS Repository - /var/www/public/stage/session-02/cds/vmw-desktop/ws 这个还挺快,选择想要的版本,下载tar包就完事了,省去了下某云盘客户端又要被限流的麻烦

Go 语言:Jank 简客博客系统

Jank 简客博客系统 什么?最近我开源了一个项目? Jank 是一个轻量级的博客系统,基于 Go 语言和 Echo 框架开发,设计理念强调极简、高效和高扩展性,旨在为用户提供功能丰富、界面简洁、操作简单且安全可靠的博客体验。…

leecode1143.最长公共子序列

这道题目和最长重复子数组是一个类型的不同之处在于text1[i]!text2[j]时dp[i][j]时他的值是继承上一行或上一列的最大值,二者dp数组的含义也不一样,这里的dp[i][j]表示的是以text[i]和text2[j]为结尾的子序列最大长度,这也是导致两种问题当判…

通过 4 种方式快速将音乐从 iPod 传输到 Android

概括 在 iPod 上听音乐很酷,但是当您拥有最新的 Android 手机时,也许您想在新手机上欣赏 iPod 音乐。那么,你的计划是什么?如何将音乐从 iPod 传输到 Android? 如果您担心这个问题,请看看下面的方法。他们…

flutter在windows平台中运行报错

PS D:\F\luichun> flutter run当运行flutter项目时,【解决如下报错】 /C:/flutter/packages/flutter/lib/src/painting/star_border.dart:530:27: Error: The getter Matrix4 isnt defined for the class _StarGenerator.- _StarGenerator is from package:flut…

[python3]Excel解析库-xlrd

xlrd 是一个用于从 Excel 文件中读取数据的 Python 库,主要用于处理 .xls 文件(即 Excel 97-2003 格式)。它允许你用 Python 编写程序来解析和提取 Excel 文件中的信息,而无需实际运行 Microsoft Excel 应用程序。需要注意的是&am…

Docker Compose编排

什么是 Docker Compose? Docker Compose 是 Docker 官方推出的开源项目,用于快速编排和管理多个 Docker 容器的应用程序。它允许用户通过一个 YAML 格式的配置文件 docker-compose.yml 来定义和运行多个相关联的应用容器,从而实现对容器的统一管理和编…

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗?

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗? 一. JVM、JDK与JRE的关系二. JVM、JDK与JRE的作用2.1 什么是JVM?2.2 什么是JDK?2.3 什么是JRE? 前言 点个免费的赞和关注,有错误的地方请指出,看个人主页有…

上下游服务间解耦的技术与管理

一、解耦为何至关重要 在当今软件研发的复杂生态中,耦合问题如影随形,困扰着众多开发者与企业。当多个模块、系统或团队紧密交织,相互依赖程度不断攀升,仿佛一张错综复杂的网,牵一发而动全身。就拿电商系统来说&#…

RP2K:一个面向细粒度图像的大规模零售商品数据集

这是一种用于细粒度图像分类的新的大规模零售产品数据集。与以往专注于相对较少产品的数据集不同,我们收集了2000多种不同零售产品的35万张图像,这些图像直接在真实的零售商店的货架上拍摄。我们的数据集旨在推进零售对象识别的研究,该研究具…

【踩坑指南:2025年最新】如何在Linux(Ubuntu)启动第一个Scala Hello World程序(Scala3)

如何正确地写出Scala的第一个程序,并且利用Scala3的简洁特性? 在解释器中直接输出Hello world非常简单,只需要直接执行即可: scala> println("Hello World") Hello World 但如果我们希望编写一个脚本文件&#xf…