钉钉 Android 端功耗优化最佳实践(上)

简介: 钉钉 Android 端功耗优化最佳实践(上)

背景

钉钉作为亿级企业数字化平台,高效即时沟通是核心能力之一,消息即时触达以及后台功耗一直是 Android 端核心体验,随着业务快速的发展,越来越多的消息信令通过钉钉自有的长连接通道推送到客户端,同时手机续航也是用户和手机厂商关心的核心体验之一。

面临的问题

在钉钉快速发展的过程中,我们收到部分用户反馈钉钉异常耗电的体验问题,主要问题集中在以下三类:

第一类问题:系统手机管家提示“钉钉后台耗电过快”。这类高耗电问题常常在用户无预期的情况下出现,尤其是在系统频繁弹出这种耗电异常的提示时,用户体验非常不好。

第二类问题:后台异常耗电严重。通常的情况是,用户反馈自己并没有在使用手机,但是手机却没电了,一看系统里的耗电排行榜,发现钉钉耗电占比大。对于这种异常耗电问题用户很疑惑,为什么后台耗电这么多?

第三类问题:前台高耗电。用户反馈使用视频类功能,耗电高,手机烫。当手机过烫的时候,还会出现过温导致应用退出、手机不可用的问题。对于这一类的问题,针对性做场景功耗优化即可。App 高耗电直接影响用户的手机续航,非常影响用户体验以及产品口碑,大大降低用户的使用意愿。针对异常功耗问题,我们发起了功耗优化专项,致力于解决异常耗电问题,提升用户体验。

挑战

Android App 功耗问题不同于 Crash、ANR 等领域有现成的成熟解决方案。Android 系统通过软件估算应用的耗电量,但是应用拿不到这个估算的电量值。同时,功耗问题通常是综合性问题,造成耗电的原因也多种多样。主要面临的挑战如下:

系统的异常耗电提醒规则和标准不明确

在应用出现异常耗电的情况下,系统会通过通知给用户提示该应用有高耗电的行为。从应用的视角来看,系统异常耗电提醒应用侧无法感知,提醒规则和标准对应用来讲是黑盒。这对于应用侧快速定位根因,解决用户问题提升了难度。

缺少现场信息,难复现

当用户反馈高耗电问题,通常不明确什么场景下出现的,用户只能提供系统的应用耗电排行和应用耗电详情。这些信息能提供一个大概的排查方向,缺少更为详细明确的现场信息,难以复现,大多情况下无法直接定位根因。

排查手段有限

耗电排行和应用耗电详情

用户反馈问题后,最直观的数据就是手机系统的耗电排行和应用耗电详情。但是没有详细信息,对于定位问题并没有太大帮助。

Bugreport + Battery Historian

除了系统的应用耗电排行和应用耗电详情之外,最主要的手段是利用 Android 的 Bugreport 结合 Battery Historian 来排查电量问题。Bugreport 日志有系统的电量统计数据,这个对于我们定位耗电原因有很大的帮助。但是,也有一些不足。

首先,针对手机管家的高功耗提醒与 Bugreport 并非一一对应,难以直接定位原因;其次,Bugreport 没有堆栈信息,比如通过 Bugreport 能看到耗电的大头是 WiFi 、移动网络或蓝牙扫描等,但具体是代码里的哪一行代码调用的还是不好排查。

另外,从实际操作上来说,Bugreport 获取比较麻烦,也需要在问题出现后及时导出,否则会错过问题现场,同时也依赖用户配合提供 Bugreport 日志。

因此,Bugreport 更适合线下分析功耗问题。

Battery Historian 示例

优化效果无法评估

最后,由于耗电量在应用侧没有一个可以量化的指标,当解决了某个功耗问题,只能靠持续回访用户长期观察和对比来判断是否有效,样本量较小,比较难通过量化指标来评估优化效果。

功耗优化方向

根据上述我们主要的功耗问题、排查过程以及面临的挑战,我们梳理了功耗优化方向,如下图:

  1. 感知能力:建立线上功耗监控能力以及异常耗电模型,主动发现异常耗电问题以及场景。
  2. 快速定位能力:通过异常耗电监控及电量报告,快速定位异常耗电问题根因。
  3. 问题治理:结合异常耗电根因,针对性解决潜在的高功耗风险。
  4. 防劣化能力:通过主动感知能力,及时感知并解决新增变更引起的高功耗风险。

功耗优化总体设计

目标

  1. 为用户提供极致体验的低功耗应用,彻底解决应用功耗问题
  2. 建设功耗感知-治理-防劣化体系能力

总体设计

  1. 感知能力
    针对线上异常耗电无法主动感知的问题:根据系统电量统计原理,全面监控钉钉各个功耗相关部件的使用情况,结合 Android Vitals 异常耗电标准以及系统提醒维度来明确监控指标以及基线,建设异常耗电诊断方案,主动发现异常耗电问题及场景。
  2. 快速定位能力
    针对功耗问题难定位难排查的问题:周期性地采样功耗部件的使用数据,统计生成电量报告,展示各个模块功耗使用情况和头部问题;通过电量报告及异常耗电检测,快速定位异常耗电问题根因。
  3. 防劣化能力
    针对线上功耗体验无法衡量的问题,我们提出功耗健康分指标衡量整体的线上功耗体验。同时,也为了防止后续功耗出现劣化情况,我们建设功耗体验指标体系,从功耗部件健康分、异常率等指标及时洞察潜在的新增功耗风险。
  4. 治理优化
    结合感知能力以及快速定位能力,梳理应用潜在的功耗异常问题,推动问题治理优化,彻底解决功耗体验问题,为用户提供低功耗的极致体验。

下面针对其中核心的关键能力进行详细的介绍。


更多精彩内容,欢迎观看:

钉钉 Android 端功耗优化最佳实践(中):https://developer.aliyun.com/article/1262697?groupCode=alibabaf2e


相关文章
|
1月前
|
移动开发 监控 Android开发
Android & iOS 使用 ARMS 用户体验监控(RUM)的最佳实践
本文主要介绍了 ARMS 用户体验监控的基本功能特性,并介绍了在几种常见场景下的最佳实践。
|
20天前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
36 4
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
61 20
Android经典面试题之图片Bitmap怎么做优化
|
2天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
2月前
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
54 2
|
2月前
|
Java Android开发 开发者
安卓应用开发中的线程管理优化技巧
【9月更文挑战第10天】在安卓开发的海洋里,线程管理犹如航行的风帆,掌握好它,能让应用乘风破浪,反之则可能遭遇性能的暗礁。本文将通过浅显易懂的语言和生动的比喻,带你探索如何优雅地处理安卓中的线程问题,从基础的线程创建到高级的线程池运用,让你的应用运行更加流畅。
|
2月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
67 0
|
4天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
2天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
13 5
|
1天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!