Android应用性能优化实践

简介:


何杰:UC优视Android技术负责人,专注Android平台应用开发方向;主导过UC浏览器的性能、内存、稳定性、网络优化,增量升级技术攻关,插件平台搭建;目前负责Android UC浏览器的架构优化。

Android应用的卡顿问题非常突出,所有用户都能感觉得到却又很难做量化卡顿的严重程度,过去的做法只是零星地发现和解决一些小点。DAU超亿级的 UC浏览器在卡顿优化的过程中建立了一套衡量卡顿严重性的数据指标与监控分析机制,并藉此有针对性地落实了200+个性能优化点。下面会介绍卡顿监控与分析的方法、常见的卡顿案例与原因。以下分享精彩内容。

背景 -- Android应用卡顿产生原因

安卓系统低效—安卓没有自己独立的渲染线程、同步接口、广播机制;

运行环境恶劣—后台进程可能几十甚至上百个同时跑、安全软件给性能带来一些挑战;

低端机占比高—低内存、弱GPU、IO瓶颈;

产品考虑不足—功能定义简陋,不一定会把整个闭环想的很清楚,功能堆积严重;

技术考虑不足。

问题—用户反馈应用卡顿,怎么办?

 复现难—用户描述模糊、不稳定出现,复现问题难。

定位难—不同机型、固件、系统状态表现不一,不确定性非常大,程序细节多、可疑面广。

衡量难—卡顿严重程度难以量化,无法掌握优化度,卡顿问题不便分类。

思路

卡 vs 顿,卡为主,顿为辅。卡和顿没有一个明显的界限,大部分顿的问题当环境足够恶劣时就会表现为卡。所以抓住卡,就能解决很多问题。

打点统计 vs 全局监控:对于上百万的代码来说,做全局监控是很难的,所以我们定了一个短期目标:主路径性能保障,打点统计;一个长期目标:整体的卡顿优化,全局监控。

线下分析 vs 线上监控:线下分析:实验室调试去复现一个问题,精确定位、粒度细;线上监控:指标衡量、粒度粗。

方案

工具应用:TraceView,StrictMode,Systrace,Overdraw。只能做调试用,无法去做一个更全面的分析和监控。

打点统计:

  耗时(针对我们的主路径,启动速度,退出速度,转页时间,多窗口的滑屏时间,启动时间、响应速度)。

  多窗口的滑屏帧率。

全局监控:做卡顿优化新的思路。

  用户反馈分析

  Anr日志分析

  Strict Anr

  Looper Hook

全局监控 -- 用户反馈

用户反馈分析,用户反馈是一个非常好的渠道。

  预警机制

  用户分类

  功能分类

  纵向对比

 图1

针对用户反馈进行很多方面的筛选,资讯类的,网页类的,性能相关的等所有信息进行一个整合,会有对应的负责人专门负责,比如像性能方面的用户反馈如图1,全部集于一个邮件发过来,我们会去关注,发现规律,通过用户的分类对手机的各个参数作聚合,也对业务各个模块反馈卡顿的占比是什么样的,指标高的对我们就是一个预警。

全局监控—anr日志分析

Anr信息很全,有所有线程的调用站,我们肯定能够知道当前主线程式卡在哪里,会有精确的定位,数据量化,把实验室的研究方式拿到线上来。

 图2 anr日志分析

全局监控 -- Strict Anr

 方案说明

  vs Anr (主线程超时,5s -> 1s)

  暴露更多问题

  精确定位问题

  方便用户联调

 图3 Strict Anr日志分析

所有的调用栈去写一个脚本,全部用图形化的方式展现出来,显示各个帧的占比,再去做一个分析,针对性的解决问题。

全局监控 -- Looper Hook

方案说明

  监控系统消息循环

  计算消息耗时

  定位耗时点(msg.what or msg.callback)

 

图4Andriod的消息循环

 图5耗时点分析

从图5看,发现卡顿点就能知道handler是谁,如果是一个message,可以知道message的ID是多少,这样我们就能准确的精确度我们自己代码的一个代码段。

 

 图6

从图6数据上看,红色和蓝色一个是2s的卡顿率,一个是1s的卡顿率,我们在灰度的版本上去搜所有的消息循环里耗时超过2s和1s的数据,把数据整理下,每天的卡顿的用户数除以UC每天的日活数,得到每天有多少用户是在卡顿这样一个卡顿率的指标,进行优化。

 

技术成果 -- 问题回顾

200+项技术优化

举例说明

  下载界面展开卡顿(分段加载)

  二维码界面展现慢(延迟加载,先出界面,再初始化相机)

  文件管理转屏卡顿(缓存复用,缓存View,转屏只重布局)

  启动完成后操作卡(线程抢占,低优先级后台线程+队列)

  视频播放控制卡顿(API兼容,异步化)

  获取网络代理卡顿(IPC异常,异步DNS+缓存)

  从第三方返回卡死(固件问题,Shield Activity)

  网页滑屏操作卡顿(GPU加速)

  So加载/Jni注册卡(异步加载+时序控制)

  SharedPreference(主线程IO,commit -> apply)

  安全软件事件拦截(沟通反馈。。。)

  ...

 

经验推广

    禁止:

  主线程文件IO(标记文件读除外)

  主线程耗CPU操作

  主线程同步IPC调用

推荐:

  异步化:产品及程序设计,预加载 + 闲时加载 + 按需加载

  线程管理:线程数限制 + 任务队列,非主线程优先级调低

  压力测试

  防御式编程

  主路径自动化数据监控

  全局性能监控

延伸:

精确化 & 自动化:用户反馈,卡顿日志

新监控方案:Api Hook

新优化方向:卡顿率 -> 帧率,低端机优化

 

                                                                                                                      PPT下载地址:http://club.alibabatech.org/resource_detail.htm?topicId=181

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
14小时前
|
缓存 移动开发 Android开发
构建高效Android应用:从内存优化到电池寿命
【5月更文挑战第18天】在移动开发领域,一个优秀的Android应用不仅要拥有流畅的用户界面和丰富的功能,更要在设备资源有限的前提下保持高效运行。本文将探讨Android应用开发中关键的性能优化策略,包括内存使用优化、CPU使用减少和电池寿命延长等方面。通过分析常见的性能瓶颈和提供实用的解决方案,帮助开发者打造更高效、更受欢迎的Android应用。
|
1天前
|
移动开发 Android开发 UED
构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第17天】 在移动开发领域,尤其是针对Android平台,性能优化和流畅的用户体验始终是开发者追求的目标。Kotlin作为一种现代的编程语言,自引入Android开发以来,其简洁、安全和互操作性的特点受到广泛欢迎。特别是Kotlin协程的推出,为解决Android平台上的并发编程问题提供了新的思路。本文将深入探讨Kotlin协程的核心优势,并通过实例展示如何在Android应用中有效利用协程来提高响应性和稳定性,从而改善整体的用户体验。
|
1天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第17天】在移动开发领域,性能优化和流畅的用户体验一直是开发者追求的目标。针对Android平台,Kotlin语言凭借其简洁性和功能丰富性成为了许多开发者的首选。其中,Kotlin协程作为异步编程的强大工具,为处理并发任务提供了轻量级的解决方案。本文深入探讨了Kotlin协程的核心优势,并通过实例分析其在Android开发中的应用,旨在帮助开发者提升应用的性能和响应能力。
|
1天前
|
缓存 Java 数据处理
提升Android应用性能的实用策略
【5月更文挑战第17天】 在竞争激烈的移动应用市场中,性能优化是提高用户体验和留存率的关键因素。本文将探讨一系列实用的技术策略,旨在帮助开发者诊断和解决Android应用中的性能瓶颈。通过深入分析内存管理、多线程处理、UI渲染效率及应用启动时间等方面,我们提供了一系列经过验证的方法和技术,以期打造更流畅、响应更快的Android应用。这些策略不仅有助于现有应用的性能提升,也为新项目的开发提供了重要的性能考量指导。
|
1天前
|
Android开发
Android Jetpack架构开发组件化应用实战,字节跳动+阿里+华为+腾讯等大厂Android面试题
Android Jetpack架构开发组件化应用实战,字节跳动+阿里+华为+腾讯等大厂Android面试题
|
1天前
|
数据库 Android开发 开发者
打造高效Android应用:Kotlin协程的全面应用
【5月更文挑战第17天】随着移动开发技术的不断进步,开发者寻求更高效的编程模式来提升应用性能和用户体验。本文深入探讨了Kotlin协程在Android开发中的应用,揭示了如何利用这一现代并发解决方案来简化异步编程,提升应用响应速度,并确保用户界面的流畅性。通过实例分析,我们将展示Kotlin协程如何与Android框架无缝集成,以及它们在处理网络请求、数据库操作和耗时任务时的优势。
8 1
|
1天前
|
移动开发 Android开发 开发者
构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第17天】 在移动开发领域,尤其是针对Android平台,性能优化和流畅的用户体验始终是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性而成为Android开发的热门选择。其中,Kotlin协程作为一种轻量级的线程管理方案,为编写异步代码提供了强大支持,使得处理并发任务更加高效和容易。本文将深入探讨Kotlin协程的核心优势,并通过具体实例展示如何在Android应用中有效利用协程来提升性能和用户体验。
|
1天前
|
缓存 程序员 定位技术
Android Studio 插件,那些被大厂优化的程序员们
Android Studio 插件,那些被大厂优化的程序员们
|
1天前
|
设计模式 算法 前端开发
Android面经分享,失业两个月,五一节前拿到Offer,设计思想与代码质量优化+程序性能优化+开发效率优化
Android面经分享,失业两个月,五一节前拿到Offer,设计思想与代码质量优化+程序性能优化+开发效率优化
|
3天前
|
移动开发 Java Android开发
构建高效Android应用:Kotlin协程的实践之路
【4月更文挑战第30天】在移动开发领域,随着用户需求的不断增长和设备性能的持续提升,实现流畅且高效的用户体验已成为开发者的首要任务。针对Android平台,Kotlin协程作为一种新兴的异步编程解决方案,以其轻量级线程管理和简洁的代码逻辑受到广泛关注。本文将深入探讨Kotlin协程的概念、优势以及在实际Android应用中的运用,通过实例演示如何利用协程提升应用性能和响应能力,为开发者提供一条构建更高效Android应用的实践路径。