Android平台功耗优化方案总结之软件层功耗定位?

2023-10-27

功耗和温升通常是Android系统的硬伤,尤其是结构空间有限的Android系统设备,比如用Android系统开发的手表设备。结构有限意味着能放的电池容量不会很大,导致待机时间变得特别短。

而且通常这种手表设备的在原始Android系统上,功耗比较正常,但内置一些功能应用后,功耗变得很大,待机时间特别短。下面是功耗分析的一般步骤:

遇到待机功耗偏高问题,分析步骤如下:
1.确定飞行模式下低电流是否正常?
  正常情况飞行模式下待机电流在3-5mA;
  不正常:给硬件和驱动分析解决;
2.若飞行模式正常,开始确认原生Launcher3的软件版本是否正常?(去掉一切客户预置的apk)
  正常情况下Launcher3软件版本
  4G模式待机电流10-13mA 
  2G/3G模式待机电流7-9mA
  需要注意的是信号不好时会影响这个范围值;  
  若不正常:抓取mtklog分析;
3.若Launcher3软件正常,加上客户预置的WatchLauncher等apk后电流不正常?
   抓取mtklog分析;
   
4.功耗异常mtklog分析方法:
   一般应用层的功耗问题有以下种情况
    一是某个应用持有唤醒锁未释放;
    二是后台有网络访问行为发生;
    三是定位调用GPS;
    四是蓝牙WIFI搜索或扫描
    五其他Sensor在后台持续工作如心率传感器。
    
4.1 首先确认是否正常待机
    要确认CPU是否正常睡眠进入待机,需要查看PowerManagerService是否释放了所有持有的唤醒锁,如下:
    查看sys_log
    Line 3115: 01-01 00:05:14.731848   973  1003 D PowerManagerService: acquireWakeLockInternal: lock=256728484, flags=0x3000001a, tag="key_u_wake_lock", ws=null, uid=1000, pid=4287
    Line 3137: 01-01 00:05:14.753272   973  1003 D PowerManagerNotifier: onWakeLockAcquired: flags=805306394, tag="key_u_wake_lock", packageName=android.fise.com.fiseassitant, ownerUid=1000, ownerPid=4287, workSource=null
    Line 4344: 01-01 00:05:24.765232   973  2238 D PowerManagerService: releaseWakeLockInternal: lock=256728484 [key_u_wake_lock], flags=0x0, total_time=10033ms
    Line 4345: 01-01 00:05:24.765673   973  2238 D PowerManagerNotifier: onWakeLockReleased: flags=805306394, tag="key_u_wake_lock", packageName=android.fise.com.fiseassitant, ownerUid=1000, ownerPid=4287, workSource=null
    Line 6433: 01-01 00:05:43.614531   973  2910 D PowerManagerService: acquireWakeLockInternal: lock=23202550, flags=0x3000001a, tag="key_u_wake_lock", ws=null, uid=1000, pid=4287
    Line 6452: 01-01 00:05:43.621134   973  2910 D PowerManagerNotifier: onWakeLockAcquired: flags=805306394, tag="key_u_wake_lock", packageName=android.fise.com.fiseassitant, ownerUid=1000, ownerPid=4287, workSource=null
  如上如果灭屏后一段时间走了PowerManagerService: releaseWakeLockInternal方法且没有在走PowerManagerService: acquireWakeLockInternal    
  其中tag是持有或释放锁的名字,packageName是持有或释放该锁的进程。
  这其中需要注意的是,测试功耗时先将时间同步到正常网络时间,并且灭屏1分钟后开始记下测试时间,精确到秒。再来对比log。 
  另外需要编译userdebug/eng版本才有PowerManagerServicelog输出,测试时只保留mobilelog开启,其他log都关闭。
4.2若CPU正常进入休眠,那说明有其他行为  
  网络访问行为需要查看mainlog,搜索关键字libc-netbsd 找到res_queryN后面的网址,如下,设备访问的每一个网址都会走这个方法:网址就是name = mepodownload.mediatek.com;
  找到应用所访问的网址,再系统里整个搜索该网址名字,搜不到则是三方应用访问。如果搜出是系统所访问,则再仔细追踪为何会走到访问网络代码。
    Line 1738: 01-01 00:00:09.832529   261  2119 D libc-netbsd: res_queryN name = mepodownload.mediatek.com., class = 1, type = 1
    Line 1944: 12-04 18:21:59.875462   261  3053 D libc-netbsd: res_queryN name = xcap.ims.mnc000.mcc460.pub.3gppnetwork.org, class = 1, type = 1
    Line 1962: 12-04 18:21:59.910583   261  3060 D libc-netbsd: res_queryN name = device.jiajialife.com, class = 1, type = 1
    Line 1983: 12-04 18:22:00.029618   261  3075 D libc-netbsd: res_queryN name = device.jiajialife.com, class = 1, type = 1
    Line 1993: 12-04 18:22:00.086842   261  3084 D libc-netbsd: res_queryN name = asia.pool.ntp.org, class = 1, type = 1
    Line 2007: 12-04 18:22:00.151345   261  3089 D libc-netbsd: res_queryN name = s.jpush.cn, class = 1, type = 1
    Line 2031: 12-04 18:22:00.633921   261  3147 D libc-netbsd: res_queryN name = push5.adups.com, class = 1, type = 1
    Line 2036: 12-04 18:22:00.697235   261  3053 D libc-netbsd: res_queryN name = xcap.ims.mnc000.mcc460.pub.3gppnetwork.org succeed
    Line 2037: 12-04 18:22:00.697236   261  3060 D libc-netbsd: res_queryN name = device.jiajialife.com succeed
    Line 2038: 12-04 18:22:00.697236   261  3075 D libc-netbsd: res_queryN name = device.jiajialife.com succeed
    Line 2052: 12-04 18:22:01.004627   261  3172 D libc-netbsd: res_queryN name = hshh.org, class = 1, type = 1
    Line 2064: 12-04 18:22:01.031378   261  3174 D libc-netbsd: res_queryN name = app-measurement.com, class = 1, type = 1
    Line 2068: 12-04 18:22:01.075390   261  3084 D libc-netbsd: res_queryN name = asia.pool.ntp.org succeed
    Line 2070: 12-04 18:22:01.538021   261  3089 D libc-netbsd: res_queryN name = s.jpush.cn succeed
    Line 2071: 12-04 18:22:01.540837   261  3172 D libc-netbsd: res_queryN name = hshh.org succeed
    Line 2072: 12-04 18:22:01.541703   261  3147 D libc-netbsd: res_queryN name = push5.adups.com succeed
    Line 2078: 12-04 18:22:01.578749   261  3174 D libc-netbsd: res_queryN name = app-measurement.com succeed
    Line 2090: 12-04 18:22:03.000968   261  3177 D libc-netbsd: res_queryN name = bsf.mnc000.mcc460.pub.3gppnetwork.org, class = 1, type = 1
    Line 2099: 12-04 18:22:03.978395   261  3177 D libc-netbsd: res_queryN name = bsf.mnc000.mcc460.pub.3gppnetwork.org succeed
    Line 2116: 12-04 18:22:09.304616   261  3209 D libc-netbsd: res_queryN name = stats.jpush.cn, class = 1, type = 1
    Line 2120: 12-04 18:22:09.738866   261  3209 D libc-netbsd: res_queryN name = stats.jpush.cn succeed
    Line 2135: 12-04 18:22:10.544604   261  3211 D libc-netbsd: res_queryN name = t1.hshh.org, class = 1, type = 1
    Line 2141: 12-04 18:22:11.455542   261  3211 D libc-netbsd: res_queryN name = t1.hshh.org succeed
    Line 2153: 12-04 18:22:13.353241   261  3215 D libc-netbsd: res_queryN name = hshh.org, class = 1, type = 1
    Line 2154: 12-04 18:22:13.353320   261  3215 D libc-netbsd: res_queryN name = hshh.org succeed
    Line 2166: 12-04 18:22:14.875000   261  3219 D libc-netbsd: res_queryN name = stats.jpush.cn, class = 1, type = 1
    Line 2167: 12-04 18:22:14.875085   261  3219 D libc-netbsd: res_queryN name = stats.jpush.cn succeed
    Line 2208: 12-04 18:22:17.129304   261  3234 D libc-netbsd: res_queryN name = supl.google.com, class = 1, type = 1
    Line 2212: 12-04 18:22:18.877794   261  3234 D libc-netbsd: res_queryN name = supl.google.com succeed
    Line 2236: 12-04 18:22:22.354728   261  3238 D libc-netbsd: res_queryN name = t1.hshh.org, class = 1, type = 1
    Line 2237: 12-04 18:22:22.354806   261  3238 D libc-netbsd: res_queryN name = t1.hshh.org succeed
    Line 2266: 12-04 18:22:25.201207   261  3317 D libc-netbsd: res_queryN name = push5.adups.com, class = 1, type = 1
    Line 2267: 12-04 18:22:25.201321   261  3317 D libc-netbsd: res_queryN name = push5.adups.com succeed
    Line 2308: 12-04 18:22:28.354897   261  3387 D libc-netbsd: res_queryN name = imtt.dd.qq.com, class = 1, type = 1
    Line 2323: 12-04 18:22:28.372317   261  3389 D libc-netbsd: res_queryN name = stats.jpush.cn, class = 1, type = 1
    Line 2324: 12-04 18:22:28.372513   261  3389 D libc-netbsd: res_queryN name = stats.jpush.cn succeed
如果看到自己的log res_queryN name = 后面没有名字输出,那说明你的代码是Android O以后的,可以去bionic/libc/dns/net/getaddrinfo.c
里面修改打印方法:
res_queryN(){
    .....
    if (LOAD_IS_USER)
        debug_log("res_queryN succeed");
    else
        debug_log("res_queryN name = %s succeed", name);
    return ancount;
    改为:
     if (LOAD_IS_USER)
        debug_log("res_queryN name = %s succeed", name);
    else
        debug_log("res_queryN name = %s succeed", name);
    return ancount;
这样再编译,访问的所有网址域名都能打印出来了。


4.3CPU正常,网络也没访问,则查看GPS定位是否有持续
 定位直接搜索Location关键字,可以搜出
 开始定位log:可以得到是gps定位还是network定位,是哪个应用调用了定位等信息。
083004 05-12 09:50:00.510   827  1468 D LocationManagerService: request 1434db9 gps Request[ACCURACY_FINE gps requested=+10s0ms fastest=+10s0ms] from com.tct.weather(10052)//是哪个应用定位。
结束定位log:
108716 05-12 09:50:31.004   827  1468 I LocationManagerService: remove 1434db9
这句log打印在LocationManagerService.java的requestLocationUpdatesLocked方法中,user版本不会输出,可以将log级别调到e级。

4.4如果CPU正常待机,没有使用网络,没有定位,功耗还是挺不正常,那可以想想是否有使用蓝牙功能,若有
搜索startLeScan字样,这里是确定使用的是蓝牙4.0或以上。
2324: 12-04 18:22:28.372513   261  3389 D BluetoothAdapter: startLeScan(): 00000000-0000-1000-8000-00805F9B34FB
然后看多久扫描一次,是不是频繁在扫描。

4.5如果蓝牙也正常,则看看是否有一些后台测试类的Sensor,如心率,血压等。计步的GSensor可以忽略,这个比较成熟消耗功耗比较少。
这个只能自己看自己的监听代码,是否睡眠后还在监听着Sensor。

找到功耗的引起的原因,有时候也不一定能优化好,比如找到是定位,但是定位必须要那么短间隔定位一次,那也没法进行优化。
不过知道每一部分功耗消耗在哪里,我们作为软件工程师也能够向客户交代,每一部分功耗消耗在哪里。

常规功耗优化手段:
 1.访问数据网络间隔尽量加长,减少访问量:比如如果和服务器后台有连接,可以减少发送数据包,心跳包等。
 2.尽量加长定位间隔:比如5分钟一次改为10分钟一次等。
 3.用户不操作时可以将网络切换到2G或3G去待机,晚上半夜期间甚至可以判断用户未使用时然后开启分析模式。-------这个效果比较好。
  
基本上所有软件层功耗问题,通过以上步骤都可以得到解决。若有遗漏,请大家补充。    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android平台功耗优化方案总结之软件层功耗定位? 的相关文章

  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • 使用 android AudioTrack 在左或右扬声器中播放声音

    我正在应用程序中的 AudioTrack 的帮助下播放声音 但我想在特定扬声器 耳朵中播放声音 即左扬声器或右扬声器或两个扬声器 以下代码是我用来播放声音的 private AudioTrack generateTone double fr
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • 如何从一个代码库创建多个 Android 应用

    我有一个 Android 代码库 它使用带有设置的 API 来获取多个应用程序的不同数据 所有应用程序都使用相同的代码库 但进行一两个设计调整 那么如何重用主代码库而不必每次都复制整个 Android 项目呢 iPhone 在同一个项目中使
  • Android 应用被 Google Play 拒绝

    我最近向 Google Play 商店提交了一个 Android 应用程序 但收到一条消息说我的应用程序已被拒绝 我不确定问题是什么 也找不到确切的解决方案 拒绝原因 违反了禁止行为条款 内容政策 经过定期审核后 我们确定您的应用程序支持
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 应用内结算错误

    我的 UNMANAGED 应用内购买无法正常工作 在它完美运行之前 我可以使用测试帐户成功购买 但它突然不起作用了 因为我记得我对商家帐户所做的只是添加更多 2 4 个测试帐户 添加后 我的应用内购买将不起作用 所以我更新了公钥并上传了一个
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 如何持续更新MPAndroidChart中的Y轴值

    我希望 LineChart 中的轴能够实时调整其最大值和最小值 当新数据的 Y 值增加 正值和负值 时 像 ResetAxisMaxValue 和 ResetAxisMinValue 这样的函数可以很好地工作 但是 一旦信号再次变低 Y 值
  • Firebase ANR - 甚至不使用 firebase

    随着 GMS 的最新更新 引入了新的 ANR 如果您退出应用程序 然后返回 则 ANR 就会初始化 线程跟踪似乎指向 Firebase 但我什至从未开始使用 Firebase 我猜它一定是新的 GMS 包的一部分 06 11 00 34 0
  • 从 TextView 中显示的数字中删除小数点[重复]

    这个问题在这里已经有答案了 对于我的简单计算器 我将结果显示在TextView 但它总是显示小数 我怎样才能删除它们 这是我的代码 public class MainActivity extends Activity implements
  • JavaDoc 在 Android 项目中不起作用

    我在 Ubuntu 10 04 上使用 Eclipse 3 5 2 进行 Android 开发 我安装了 来自 Ubuntu 存储库的 Sun JDK Eclipse 3 5 2 经典 来自 eclipse org 解压到 opt ecli
  • java.lang.IllegalArgumentException:找不到片段的 id 0x1020002 (android:id/content) 的视图

    我正在尝试从一个片段移动到另一个片段 它在片段事务期间显示以下错误 java lang IllegalArgumentException No view found for id 0x1020002 android id content f
  • Android Studio IDE 上的“文本/设计”选项卡缺少新的 Android 项目

    如何在创建新项目期间自动创建的 Activity main xml 文件的 src main res layout 文件夹中启用文本 设计选项卡 如果我右键单击并在所述文件夹上创建 xml 文件 则设计 文本选项卡存在 有什么建议吗 谢谢
  • Vimeo 视频在 Android 6 设备上停止播放

    我正在尝试在我的应用程序中播放 Vimeo 的视频 问题是在 Android 6 设备上 视频会在一定时间后停止播放 在 API 较低的设备上一切正常 时间取决于质量 对于下面提供的网址的视频 播放一定分钟 1 到 3 视频质量有多低 播放
  • 在为 Android 实现 Google 登录时,任务“:app:transformClassesWithDexForDebug”执行失败

    我正在尝试为 Android 实现 Google 登录 并且我正在按照以下说明进行操作 https developers google com identity sign in android start integrating https
  • Nexus 7 (2013) 和 Win 7 64 - 尽管检查了许多论坛和在线资源,仍无法安装 USB 驱动程序

    我正在尝试设置 Nexus 7 2013 进行调试 但我在安装 USB 驱动程序的步骤中陷入困境 到目前为止 这是我尝试过的 采取的步骤 在 Nexus 7 2013 上打开调试模式 连接设备至 PC 下载 Google USB 驱动程序于
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • 当ScrollView滚动到底部时加载更多数据

    我有一个带有动态加载内容的滚动视图 有时可能会有很多内容 所以我想在用户滚动到底部时加载更多内容 我搜索了合适的方法 发现了两种 onScrollChanged and getScrollY 但我不知道如何将它用于我的目的 请给我一些建议

随机推荐

  • IDEA从C盘搬到D盘打开找不到jvm解决办法

    首先 关闭IDEA 将IDEA整个文件夹首先将IDEA整个文件夹复制到你想要放得盘符 打开IDEA安装目录的bin目录 修改idea exe vmoptions中 javaagent D IDEA IntelliJ IDEA 2017 3
  • 认识计算机选题背景,与计算机专业相关的论文_计算机专业的毕业论文题目有哪些_大一我对计算机的认识3000字论文...

    求个金融学和计算机科学与技术这两个专业相关的论文题目 展开全部 互联网金融对传统银行业的影响分析与研究 或者针对某一个细分 比如P2P 支付宝 蚂蚁金融等等 为什么身边的人都想学计算机 计算机真的有那么好吗 作为资深码农 个人觉得这个问题可
  • 最大不能组合数和不能组合数的个数

    A New Change Problem Time Limit 5000 1000 MS Java Others Memory Limit 32768 32768 K Java Others Total Submission s 1609
  • Lua脚本做游戏外挂

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 第一件事当然就是搞账号 淘宝某店 一元100个网易邮箱 店铺已打马赛克 支付后老板给我发了一堆账号 粘贴word文档看下对不对数 刚好100个 不然就差评了 如果这100个
  • 最适合初学者的Python入门详细攻略,一文讲清,赶紧收藏

    目前python可以说是一门非常火爆的编程语言 应用范围也非常的广泛 工资也挺高 未来发展也极好 Python究竟应该怎么学呢 我自己最初也是从零基础开始学习Python的 给大家分享Python的学习思路和方法 一味的买书看书 看视频 是
  • 材料阅读 - 物联网设备指纹 - 某篇论文的相关工作

    20201030 本篇论文 1 是在了解设备指纹的时候看到的 一开始没仔细看 这两天正好集中整理一下 但是这篇文章说实话 不敢苟同 我仔细读了读就感觉有很大问题 看不到具体的干货 文章地址是 1 看了一下他这里的一个同行评议 无话可说 我在
  • jQuery 判断数组集合 是否包含相同元素.

    定义 组装数组对象 筛选重复对象 isRepeat function data var i 0 var obj var arry for i i lt data length i obj data i if
  • 强化学习 学习资料整理(持续更新)

    关于强化学习 比较经典的书当然是 Richard Sutton 的 Reinforcement Learning An Introduction 下面的资料大部分也是关于这本书的读书笔记和相关课程及代码 教学视频系列 强化学习纲要 十课 代
  • 2028:【例4.14】百钱买百鸡

    2028 例4 14 百钱买百鸡 时间限制 1000 ms 内存限制 65536 KB 提交数 1393 通过数 595 题目描述 百钱买百鸡问题 鸡翁一 值钱五 鸡母一 值钱三 鸡雏三 值钱一 百钱买百鸡 问鸡翁 鸡母 鸡雏各几何 输入
  • 使用线程以及对信号量 AutoResetEvent和ManualResetEvent的理解

    声明线程 DoThreads是串口执行的方法名称 Thread DoThreads new Thread new ThreadStart DoThreads DoThreads IsBackground true 是否跟着主线程结束而结束
  • 【翻译】 用纸质电路增加开源的包容性

    你知道吗 LWN net是一份由订阅者支持的出版物 我们依靠订阅者来维持整个运作 请通过购买订阅来帮助我们 让LWN继续在网上运行 作者 Jonathan Corbet 2018年1月30日 linux conf au 开源软件有一个包容性
  • JS正则表达式(二)

    取得字符串的字节长度 代码 function strlen str var i var len len 0 for i 0 i
  • 行人重识别(ReID)概述

    什么是Re ID 行人重识别 Person Re identification也称行人再识别 简称为ReID 是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术 广泛被认为是一个图像检索的子问题 给定一个监控行人图像 检索跨设
  • mysql 快照和binlog_利用快照卷和日志文件对mysql数据库备份和恢复

    基于快照卷做备份和日志文件做恢复 1 首先对数据库施加读锁 2 记录二进制日志文件的文件名和事件位置 3 创建快照卷 4 解锁数据库 5 挂载快照卷 复制数据文件 6 删除快照卷 登录mysql服务器 root station58 mysq
  • 使用python中的matplotlib绘画激活函数图像

    使用python中的matplotlib绘画激活函数图像 import matplotlib pyplot as plt import numpy as np plt rcParams font sans serif SimHei 显示汉字
  • 1033 旧键盘打字(20)(20 分)

    旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在2行中分别给出坏掉的那些键 以及应该输入的文字 其中对应英文字母的坏键以大写给出 每段文
  • 使用Python对excel中的数据进行处理

    一 读取excel中的数据 首先引入pandas库 没有的话使用控制台安装 pip install pandas import pandas as pd 引入pandas库 别名为pd read excel用于读取excel中的数据 这里只
  • Filtering arrays in Dart

    Dart Filtering arrays in Dart 初探Dart 初次接触Dart这个语言 感觉语法还是还是很舒服的 定义类 枚举什么的 语言都挺简洁 很友好的构造函数 这种最新的语言能够兼容之前老的语言的很多优点 唯一感觉不能理解
  • 7-1 用格里高利公式求给定精度的PI值 (15分)

    教育超市 浙大版 C语言程序设计 第3版 第4章 循环结构 练习4 1 用格里高利公式求 的近似值 本题要求编写程序 计算序列部分和 4 1 1 3 1 5 1 7 直到最后一项的绝对值小于给定精度eps 输入格式 输入在一行中给出一个正实
  • Android平台功耗优化方案总结之软件层功耗定位?

    功耗和温升通常是Android系统的硬伤 尤其是结构空间有限的Android系统设备 比如用Android系统开发的手表设备 结构有限意味着能放的电池容量不会很大 导致待机时间变得特别短 而且通常这种手表设备的在原始Android系统上 功