Android移动端性能浅谈

当产品日渐成熟,当与竞品功能追赶趋于一致,当小群效应渐渐显露,性能将浮出水面,草灰蛇线,但又潜移默化间带来影响。

一、背景

      随着移动端项目趋于成熟,很多app与对手公司已经初步度过了抢占市场份额的阶段,开始进入留存、再付费、用户粘性的赛道,这时候,可能一些曾经为了匆忙上线、或初期架构限制导致的遗留问题等等,导致部分功能虽然实现,但在用户体验上感官不佳,一旦出现问题,将面临失信于用户,流失用户的情况;

      当然,如果产品具有唯一性和必要性时,他的性能表现,可能会带来用户吐槽,但迫于现状,不得不继续使用,例如曾经的12306;但反观现在,大家更习惯用美团、携程、飞猪等长期使用“感官”良好稳定app;

      所以,当产品是可选时,“感官体验”将是影响用户留存、再付费、用户粘性的一大考验。举个例子,我一直以来都有看直播午睡的习惯,在17年之前,我一直用的是斗鱼客户端,后来斗鱼的PC客户端在长时间播放时,经常会出现“卡顿”、“无限回放”、“音视频不同步”,甚至出现过卡死黑屏的情况,我就换用了虎牙直播,即使后来斗鱼可能在新的版本修复了这些问题,但因为我在虎牙的使用期间没有出过什么大问题,就再也没有换回来,一直用到今天;

      性能的优化,一直以来,都是一条需要持续关注的特殊赛道!功能追赶的路上,既要考虑效率和收益,也要考虑长期可持续优化,一旦步子大了,容易把用户扯没了~

二、性能项释义,以及带来的影响

1.物理占用

        1.1 包体积

                1>包体积是指安装包的体积大小

                2>影响:

                        2.1>分享

                        常见的拉新方法中,分享占着必不可少的部分,例如常见的从app内活动页点击分享,自动带apk到WhatsApp聊天框;(一些公司会通过出极速版进行分享,安装后部分模块再通过Wi-Fi网络下载)

                        2.2>下载、安装

                        部分场景下,包体积过大,可能会影响用户决定是否下载、安装;例如用户使用流量下载,例如用户手机内空间不足等等;

        1.2 空间(物理内存)占用

                1>空间占用一般由应用程序占用、数据占用和缓存构成

                2>影响:

                        2.1>运行

                        较高的空间占用,会导致Android机器设备负载升高,影响运行流畅性,有时也会导致crash、ANR等等

2.启动时长

        2.1 冷启

                1>冷启一般是指后台无该应用进程时(区分保活机收集数据),从用户启动app开始,期间系统创建进程分配给该应用,再到应用完成初始化(SplashActivity)后进入首页;

                2>影响

                        2.1>较快的进入能带给用户更好更快的体验;有些公司也会通过设置开屏广告,来遮盖启动慢的问题;

                        2.2>冷启一般可参考2/5/8原则,2秒内可以接受,5秒内需要优化,8秒内体验较差,超出8秒就是事故了~

        2.2 热启

                1>热启动则是后台有该进程(进程处于活跃状态)下,启动app的时长;

                2>影响

                        2.1>较快的完成切入事务的处理,可以让用户可以尽快恢复使用;

                        2.2>热启一般可参考1/2/4原则,同理如果一个app只是切到后台再切回来,并且进程处于活跃状态,这种情况下超过4秒不可以操作,那基本上可以跳过优化app,直接优化RD和QA了;

        2.3 完全启动

                1>有时根据场景不同,会关注从用户点击app icon开始,到首页可操作的第一桢时长,这种统计更贴近用户视角去关注“体感”启动时长,这里可能会考虑到首页的逻辑判断、缓存、数据加载、渲染等等;

                2>影响

                更快的完全启动,能给用户带来更好的体验,降低等待成本;

        2.4 deeplink启动

                1>一些特定的场景,会关注deeplink启动时长,例如分享落地页掉起app时,从启动到跳转再到页面渲染的总时长,时间过长会影响活动最终的转化;

                2>影响

                从deeplink启动进来的场景,一般有特定的目的,例如某个活动的落地页,跳转回app内的指定活动页,那么跳转路径上的非必要元素,可以选择不加载或者后加载;

        2.5 无网启动

                1>一般关注无网时loading、重试、再到缺省展示时长;

                2>影响

                我曾经遇到过,遇到网络问题导致的启动失败,除了重启无法恢复的问题;没有缺省页,没有刷新,没用重试按钮,甚至config接口已经失败了,但后续接口没有限制重试次数无限重连;

                我们要重视每一次用户重启的成本,这对于一个流畅性要求高的特定场景来说,是致命的;

3.PSS(内存占用)

        3.1 在Android系统中,每个APP进程除了同其他进程共享内存(shared dirty)外,还独用私有内存(private dirty),通常我们使用PSS(私有内存+比例分配共享内存)来衡量一个APP的内存开销。由于一个移动设备的内存是固定的,如果内存消耗过大就会造成应用卡顿或者闪退,需要对内存进行测试。正常情况下,应用不应占用过多的内存资源,且能够及时释放内存,保证整个应用内的稳定性和流畅性。

可以通过 adb shell dumpsys meminfo packageName获取

        3.2 影响

        Kill:当app置于后台时,如果Android系统在遇到内存开销不足的特定情况下,会按照PSS由大到小的顺序开始杀死进程。

        Crash:崩溃

        其他:当发生OOM(内存泄漏)时,还可能会出现程序卡顿、响应速度慢、重启、ANR等

4.CPU

        我们在做CPU测试时,除了关注设备本身的性能属性,也会关注当前环境的性能负荷;例如国内用户一般会在后台开着微信、音乐软件、拍照软件等等,海外部分地区用户一般开着Facebook、WhatsApp、instagram等等;在做性能测试时,除了考虑待测app给设备带来的性能压力,也要考虑待测app在不同设备性能负荷下的表现;

4.1 关注点

        1>CPU总体使用率

        2>应用程序CPU占用率

4.2 关注方法

        1>android自带的DDMS可视化工具

        2>Android Studio 3>通过linux系统/proc/stat和/proc/<pid>/stat文件进行占用率的计算

        3>通过top命令或者dumpsys cupinfo等命令实时查看当前cpu情况。

4.4 影响

        王者在今年下半年的某个版本中,大家一玩就会发现特别烫,除了系统兼容性的特征外,CPU占用率高也是一个比重较高的原因;我们在关注应用占用CPU率时,要保证在合理的范围内控制有效占用,也要关注在不同的运行环境、设备性能负荷下进行流畅性、温度、电量等验证;

        过高的CPU占用除了影响运行流程、温度、电量消耗,还可能会导致app重启、crash、ANR等致命问题;

5.FPS

        5.1 FPS(流畅度),玩FPS游戏的同学应该不陌生,理论上来讲,FPS达到系统预期(Android系统一般要求每一帧在16ms内绘制完成)则不会出现明显卡顿;当16ms内没有完成绘制,则会发生掉帧,就会引起用户注意;

        5.2 影响

不合理的布局、过度绘制、频繁的垃圾回收等等都是可能会触发掉帧的原因,当发生掉帧后,用户就会感觉卡顿、不流畅;另外还会有画面撕裂、偏移等问题;一般对于fps游戏,这是一项很关键的指标;举个例子,当你玩吃鸡的时候,每次遇到人就会卡卡的,他可能不是网络问题,而是fps掉帧问题哦~

6.GPU渲染(Profile GPU Rendering)

        6.1 GPU渲染一般指每帧画面的渲染消耗,一般由绘制时间、执行时间、处理时间三部分组成;大多数android机器都带有GPU渲染的Debug功能;

6.2 影响

        GPU的渲染一般影响着FPS流畅度

        GPU的过度绘制:

        蓝:过度绘制1次;

        绿:过度绘制2次;

        粉红:过度绘制3次;

        红色:过度绘制4次或更多。

7.电耗

        7.1 APP消耗电量为 APP运行过程中,涉及各部件的消耗电量总和;

        Wakelock(保持唤醒锁):Android系统为了尽可能的增加设备的续航能力,会不断的关闭各种硬件模块来节省电量。当我们在app休眠时想要进行网络请求,会先唤醒设备,接着进行网络请求,经过一段时间后设备再次慢慢进入休眠状态;

        当设备运行在前台时,CPU(I/O、处理事物)、网络(网络传输的数据量)、各种传感器(陀螺仪、GPS)等使用,都决定app的电量消耗排行;

        7.2 影响

        过多、过快的消耗电量,影响部分场景下用户使用的意愿;我们可以通过排查场景上的非必要事务,来优化电量消耗;也可以通过推迟非面向用户的任务、设定部分事务的处理时机(例如充电时备份数据)、或特定资源Wi-Fi下载、零散任务合并等等策略,来提升用户在非充电情况下的电耗感知;

8.流耗

        8.1 现在Android应用市场有很多流量统计的软件可以直观观测到app运行过程中的流量消耗统计;

        8.2 统计纬度

                1>Wi-Fi

                2>3G/4G/5G

        8.3 影响

        一般用户认为,网络高开销的app,除了消耗他大量流量以外,也会消耗很多他的电量,甚至把手机运行时的卡顿、过热、死机等问题都推给这个原因;所以,我们应该注重网络消耗,通过排查非必要资源请求、缓存、资源下载时机等等方法,降低用户的高流耗感知;

9. 兼容性

        9.1 兼容性测试是指测试软件在特定的硬件产台上、不同的应用软件之间、不同的操作系统平台上、不同的网络等环境中是否能很好地运行的测试

        9.2 影响

        Android的不同品牌、机型、分辨率、不同架构的CPU、不同的操作系统等等都会影响软件的性能表现。

10. 稳定性

        10.1 稳定性除了Crash、ANR、性能纬度,还需关注业务的高可用性;在一些核心流程上,随着用户量增加,业务访问量增加,极易出现稳定性问题,所以对于核心流程的稳定性保障是非常必要的;

        10.2 分类

                1>崩溃(Crash)

                2>ANR

                3>性能

                4>业务高可用性

        10.3 影响

        较高的稳定性在满足用户日常产品需要的同时,也会持续增加产品可信度,是用户自推广、自裂变的关键前提之一,稳定性不仅影响留存、再付费,也会侧面的影响增长指标;我们可以通过监控、自动化手段等预警机制,提高稳定性保障,降低稳定性问题的处理时常;

三、性能三角

在性能测试开始前,对于性能测试的数据准备是非常重要的一点,要根据产品的受众国家、目标用户、设备环境、网络环境等情况综合制定;

1. 设备&环境

        过往的性能测试中,我们一般会先通过hive去查一下相关数据,包括当前产品覆盖的top机型、top系统(版本),选用占比较高的机型进行性能数据采集设备,能更好的贴近真实场景数据;

        拿到设备后,我们会根据产品主要覆盖的国家,有针对有特色的去模拟当地用户的各种环境,例如我们收集的用户已安装app_list,然后通过分析网站获取该国家、该年龄段,用户使用app的习惯和周期,去进行环境的准备;

        例如:曾经做过的某国外音乐软件app性能测试,其中一台设备选用了用户量占比最高的红米note4

        1>设备主要参数:4GB内存+64GB闪存,CPU最高主频2.1吉赫兹,5.5英寸屏,4100毫安电池,5伏/2安充电,传感器包含(红外、陀螺仪、环境光传感器等等),GPS,指纹,双卡双待,MIUI8等等

        2>环境主要参数:

                2.1>已安装:待测app、Facebook、WhatsApp、instagram、soloP、Messenger、Snapchat、Twitter、Paytm、Zomato、Swiggy、KFC、Pizza Hut、Amazon、My More Store、Big Basket、Google Map、Tinder、Book My Show、Indian Railway、Jugnoo等等

                2.2>已启动:待测app、Messenger、WhatsApp、soloP、还有一些基础的google服务和其他应用的后台进程;

                2.3>网络:因具体情况特定;

2.场景

        关于性能测试场景的选择,我们也是通过埋点梳理出核心业务覆盖率最高的5大流程,针对该流程进行场景设计,设计完成后通过评审、路径优化等敲定了最终方案;

3.指标

        大多数性能指标都有两条曲线,一条是业内平均,另一条是竞品曲线;我们设定存量版本的性能指标,一般要不低于业内平均,也要赶超竞品指标;当进行一段时间后,则需要关注增量版本性能指标,如果当前版本与上一版本的性能数据差异较大,就需要分析功能实现是否合理、分析性能数据日志、定位问题场景,进行专项优化了;

四、性能项获取工具

1.物理占用

        1.1 包体积

                Jenkins统计/APK包大小统计

        1.2 空间(物理内存)占用

                系统-应用程序统计

2.启动时长

        adb/PerfDog/AirtestIDE

3.PSS(内存占用)

        adb/Android Profiler(Android Studio)/PerfDog/soloP

4.CPU

        adb/Android Profiler(Android Studio)/PerfDog/soloP

5.FPS

        adb/GT/PerfDog

6.GPU渲染

        Android系统开发者工具/Profile GPU rendering/PerfDog

7.电耗

        adb/Battery Historian/PerfDog

8.流耗

        adb/Android Profiler(Android Studio)/PerfDog

9. 兼容性

        云测/自动化

10. 稳定性

        专项治理/监控/自动化

五、性能自动化与CI(持续集成)

1. 物理占用:利用python或其他语言脚本获取;

2. 启动时长:利用AirtestIDE(poco+图像识别)+adb获取;

3. PSS、CPU:利用AirtestIDE+SoloP实现的UI自动化场景外层嵌套性能录制;再通过python脚本分析计算性能数据;

4. FPS、GPU、电耗、流耗:同理可以使用airtestIDE+PerfDog+python来实现自动化数据收集;

5. 通过Jenkins和shell脚本将这些能力整合起来,再集成现有的打包工具、虚拟机或真机,进行性能自动化的持续集成;

六、附录文档

AirtestIDE

SoloPi

PerfDog

adb获取性能参数

GT性能测试Android版使用说明

Jenkins自动化部署入门详细教程

努力只能及格,拼命才能优秀~

猜你喜欢

转载自blog.csdn.net/yaoliang_cui/article/details/132423922
今日推荐