Android 专项性能分析总览

Posted 初一十五啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 专项性能分析总览相关的知识,希望对你有一定的参考价值。

一、为什么要做性能优化

  • 性能是功能的基础
  • 性能直接和钱产生关系
  • 衡量技术栈的强劲指标

二、android专项性能

2·1 构建性能检测、治理需要哪些技术栈

2.2 作为Android开发工程师在这个技术栈中发力的点在哪里?

我们作为和用户直接接触者,我们的侧重点应该放在指标上,而达成这些指标的作用力就是图中所描述的技能,这些技能掌握的越多,指标会完成的越好。

  • 平台
  • 交互类性能
  • 资源类性能

三、什么是交互类&资源类性能

3.1 交互类

  • 什么是交互类性能
    • 流畅度
    • 时延
  • 它的本质是什么

例如流畅度问题

  • 可以是内存的垃圾回收太频繁导致的,因为有些GC会STOP THE WORLD;
  • 可以是CPU问题,decode图片开了过多的子线程,导致主线程的CPU资源被争抢;
  • 可以是在主线程中读/写磁盘,磁盘读/写耗时抖一抖、界面也跟着卡一卡

3.2 资源类

  • 什么是资源类性能
    • 磁盘
    • CPU
    • 内存
    • 环境密切相关的网络
    • 电池(耗电)

3.3 交互类性能和资源类性能

分析交互类性能后得知,它的本质就是资源类问题。

四、资源类问题

4.1 磁盘

  • 扇区、块、页等概念
4.1.1 磁盘I/O 随机读写
  • 我们对磁盘最多的操作就是读、写
    • 磁盘的读写性能目前是怎样的状态
    • 磁盘的读写有那几种方式
  • 读写的方式有哪些
    • 顺序读写
    • 随机读写
    • 磁盘顺序读写的区别

  • 暂时无法在飞书文档外展示此内容 - 首先需要明确一个问题,顺序读是对于顺序写而言的,只有顺序写的数据,才能顺序读 - 当设备使用时间长 存在删除操作等场景时,将出现不连续的内存空间,此时的写将变成随机写,自然也就变成了随机读 - ##### 4.1.2 随机读写的性能
  • 根据腾讯的调查报告显示

  • 顺序读/写比起以前的性能,那是大幅度提升,跟SSD的差距已经缩小了很多
  • 随机读/写的性能依旧很差,见MOTO X、S7、iPhone 6S Plus

4.2 写入放大效应

4.2.1 什么是写入放大效应?

当数据第一次写入时,由于所有的颗粒都为已擦除状态,所以数据能够以页为最小单位直接写入进去。当有新的数据写入需要替换旧的数据时,主控制器将把新的数据写入到另外的空白闪存空间上(已擦除状态),然后更新逻辑LBA地址来指向到新的物理FTL地址。此时,旧的地址内容就变成了无效的数据,但主控制器并没执行擦除操作而是会标记对应的“页”为无效。当磁盘需要在上述无效区域进行再次写入的话,为了得到空闲空间,闪存必须先复制该“块”中所有的有效“页”到新的“块”里,并擦除旧“块”后,才能写入

例子:写入一个4KB的数据,最坏的情况就是,一个块里已经没有干净空间了,但是恰好有一个“页”的无效数据可以擦除,所以主控就把所有的数据读出来,擦除块,再加上这个4KB新数据写回去。回顾整个过程,其实只想写4KB的数据,结果造成了整个块(512KB)的写入操作。同时带来了原本只需要简单地写4KB的操作变成了“闪存读取(512KB)->缓存改(4KB)->闪存擦除(512KB)->闪存写入(512KB)”,这造成了延迟大大增加,速度慢是自然的。这就是所谓的“写入放大”(Write Amplification)问题

4.2.2 造成写入放大效应的原因
  • 外因:手机长期使用,磁盘空间不足。
  • 内因:应用触发大量随机写。
  • 结果:磁盘I/O的耗时会产生剧烈的波动,导致应用卡顿

4.3 定位、分析、解决磁盘问题

我们避免不了手机长期使用磁盘不足的问题,所以App能做的只有一件事,即减少磁盘I/O的操作量,特别是主线程的操作量

4.3.1 常见的磁盘优化相关的工具

目前我们应用也接入了I/O Monitor 监控,它其实具备很多功能。

4.3.2 案例

问题类型: I/O效率低

Bitmap 解码优化

4.4 磁盘的专项标准(腾讯)

五、内存

5.1 重复下载的流量问题

可以缓存到存储中;缓存到存储要读出来,就变成磁盘I/O问题;为了避免磁盘I/O问题怎么办,用内存缓存起来。什么都用内存缓存起来,App的常驻内存就会很大,变成内存问题,甚至最后成为OOM的导火索

5.2 Android 应用的内存问题

  • 虚拟机的堆内存最大值
    • 64MB、128MB
    • manifest里面设置LargeHeap为true
  • low memory killer机制
    • 在内存资源稀缺的大背景下,为了保证在极端情况下,前台App和系统还能稳定运行,就只有靠low memory killer机制
    • App占用内存越多,被Low Memory Killer处理掉的机会就越大
  • GC
  • 内存泄漏

  • 图片缓存

5.3 内存问题

后果会导致App Crash、闪退、后台被杀、卡顿,而且这是各种资源类性能问题积压的最后一环

  • 常驻问题(主要是图片缓存)
  • 泄漏问题(主要是Activity泄漏)
  • GC问题(关键是GC For Alloc)

5.4 定位内存问题相关的工具

5.5 内存的专项标准

六、CPU 问题

一种是I/O密集型问题,另外一种就是CPU密集型的问题

6.1 CPU资源冗余使用

算法太糙,明明可以遍历一次的却遍历两次,主要出现在查找、排序、删除等环节;也可以是没有cache,明明解码过一次的图片还重复解码。还有,明明使用int就足够,偏偏要用long,导致CPU的运算压力多出4倍

6.2 CPU资源争抢

  • 抢主线程的CPU资源 , 最典型的就是Handler优化问题
  • 抢音视频的CPU资源
    • 例子:音视频编解码

本身就消耗了大量的CPU资源,同时音视频编解码对于解码的速度是有硬要求的,达不到就会有产生播放流畅度的问题,很容易就达到了CPU满负载的状态

  • 解决方式

  • 首先不能让音视频卡顿

  • 可以减负一些非核心的业务消耗

  • CPU负载转换为GPU负载

  • 大家平等,相互抢(前两种最起码都有主次之分,强弱之别)

6.3 CPU资源利用率低

CPU就是速度与负载的博弈,用得多会耗电、会卡顿,用得少也会有问题,像启动、界面切换、音视频编解码这些场景,为了保证其速度,不好好利用CPU,真对不起核心数的不断飙升。而导致无法充分利用CPU的因素,除了前面说的磁盘和网络I/O外,还有锁操作、sleep等。其中锁的优化,一般在锁的范围上,主要是尽可能地缩减范围。

6.4 使用工具

  • Profiler
  • TOP
  • PS (adb)
  • Systrace

6.5 专项标准(腾讯)

更多Android 知识点归整

Android 性能调优系列https://0a.fit/dNHYY

Android 车载学习指南https://0a.fit/jdVoy

Android Framework核心知识点笔记https://0a.fit/acnLL

Android 音视频学习笔记https://0a.fit/BzPVh

Jetpack全家桶(含Compose)https://0a.fit/GQJSl

Kotlin 入门到精进https://0a.fit/kdfWR

Flutter 基础到进阶实战https://0a.fit/xvcHV

Android 八大知识体系https://0a.fit/mieWJ

Android 中高级面试题锦https://0a.fit/YXwVq

后续如有新知识点,将会持续更新,尽请期待……

以上是关于Android 专项性能分析总览的主要内容,如果未能解决你的问题,请参考以下文章

Android APP性能及专项测试(个人整理)

Android性能专项FPS测试实践

《Android移动性能实战》腾讯 SNG 专项测试团队 著 高清pdf

Android UI性能专项测试及优化

Android UI性能专项测试及优化

《Android 性能测试初探》