提到 Android 体系手机,大部分人的印象是用了一段时刻就变得有点卡顿,有些程序在运转期间不可思议的呈现溃散,翻开体系文件夹一看,发现多了许多文件,然后用手机管家 APP 不断地进行收拾优化 ,才感觉运转速度略微进步了点,就算手机在各种功用跑分软件面前分数遥遥领先,仍是感觉不管有多大的内存空间都远远不够用。信任每个运用 Android 体系的用户都有过以上相似阅历,的确,Android 体系在流通性方面不如 IOS 体系,为何呢,分明在看手机硬件装备上时,Android 设备都不会输于 IOS 设备,乃至都强于它,要害是在于软件上。
形成这种现象的原因是多方面的,简略罗列几点如下:
• 其实近年来,跟着 Android 版别不断迭代,Google 供给的Android 体系现已越来越流通,现在最新发布的版别是 Android 8.0 Oreo 。可是在国内大部分用户用的 Android 手机系是各大厂商定制过的版别,往往不是最新的原生体系内核,或许绝大多数还停留在 Android 5.0 体系上,乃至 Android 6.0 以上所占份额还偏小,更新存在推迟性。
• 因为 Android 体系源码是敞开的,每个人只需遵照相应的协议,就能够对源码进行修正,那么国内各个厂商就把依据 Android 源码改形成自己对外发布的体系,比方咱们了解的小米手机 Miui 体系、华为手机 EMUI 体系、Oppo 手机 ColorOS 体系等。因为每个厂商都修正过 Android 原生体系源码,这里边就会引发一个问题,那便是闻名的Android 碎片化问题,实质便是不同 Android 体系的运用兼容性不同,达不到一致性。
• 因为存在着各种 Android 碎片化和兼容性问题,导致 Android 开发者在开发运用时需求对不同体系进行适配,一起每个 Android 开发者的开发水平良莠不齐,写出来的运用功用也都存在不同类型的问题,导致用户在运用进程顶用户体会感触不同,那么有些问题用户就会转化为 Android 体系问题,然后影响对Android 手机的点评。
功用优化
今日想说的重点是Android APP 功用优化,也便是在开发运用程序时应该留意的点有哪些,怎么更好地进步用户体会。一个好的运用,除了要有招引人的功用和交互之外,在功用上也应该有高的要求,即时运用十分具有特征,在产品前期或许招引了部分用户,可是用户体会欠好的话,也会给产品带来欠好的口碑。
那么一个好的运用应该怎么界说呢?首要有以下三方面:
• 事务/功用
• 契合逻辑的交互
• 优异的功用
众所周知,Android 体系作为以移动设备为主的操作体系,硬件装备是有必定的约束的,尽管装备现在越来越高档,但仍然无法与 PC 比较,在 CPU 和内存上运用不合理或许耗费资源多时,就会碰到内存不足导致的安稳性问题、CPU 耗费太多导致的卡顿问题等。
面临问题时,咱们想到的都是联络用户,然后检查日志,但殊不知有关功用类问题的反应,原因也十分难找,日志大多用途不大,为何呢?因为功用问题大部分对错必现的问题,问题定位很难复现,而又没有要害的日志,当然就无法找到原因了。这些问题十分影响用户体会和功用运用,所以了解一些功用优化的一些处理方案就显得很重要了,并在实践的项目中优化咱们的运用,然后进步用户体会。
四个方面
能够把用户体会的功用问题首要总结为4个类别:
• 流通
• 安稳
• 省电、省流量
• 装置包小
功用问题的首要原因是什么,原因有相同的,也有不同的,但归根结底,不外乎内存运用、代码功率、适宜的战略逻辑、代码质量、装置包体积这一类问题,收拾归类如下:
从图中能够看到,打造一个高质量的运用应该以4个方向为方针:快、稳、省、小。
快:运用时防止呈现卡顿,呼应速度快,削减用户等候的时刻,满意用户希望。
稳:减低 crash 率和 ANR 率,不要在用户运用进程中溃散和无呼应。
省:节约流量和耗电,削减用户运用本钱,防止运用时导致手机发烫。
小:装置包小能够下降用户的装置本钱。
要想到达这4个方针,详细完结是在右边框里的问题:卡顿、内存运用不合理、代码质量差、代码逻辑乱、装置包过大,这些问题也是在开发进程中碰到最多的问题,在完结事务需求一起,也需求考虑到这点,多花时刻去考虑,怎么防止功用完结后再来做优化,否则的话等功用完结后带来的保护本钱会添加。
卡顿优化
Android 运用发动慢,运用时常常卡顿,是十分影响用户体会的,应该尽量防止呈现。卡顿的场景有许多,按场景能够分为4类:UI 制作、运用发动、页面跳转、事情呼应,如图:
这4种卡顿场景的根本原因能够分为两大类:
• 界面制作。
首要原因是制作的层级深、页面杂乱、改写不合理,因为这些原因导致卡顿的场景更多呈现在 UI 和发动后的初始界面以及跳转到页面的制作上。
• 数据处理。
导致这种卡顿场景的原因是数据处理量太大,一般分为三种状况:
一是数据在处理 UI 线程,
二是数据处理占用 CPU 高,导致主线程拿不到时刻片,
三是内存添加导致 GC 频频,然后引起卡顿。
引起卡顿的原因许多,但不管怎么样的原因和场景,终究都是经过设备屏幕上显现来到达用户,归根结底便是显现有问题,所以,要处理卡顿,就要先了解 Android 体系的显现原理。
Android体系显现原理
Android 显现进程能够简略归纳为:Android 运用程序把经过丈量、布局、制作后的 surface 缓存数据,经过 SurfaceFlinger 把数据烘托到显现屏幕上, 经过 Android 的改写机制来改写数据。也便是说运用层担任制作,体系层担任烘托,经过进程间通讯把运用层需求制作的数据传递到体系层服务,体系层服务经过改写机制把数据更新到屏幕上。
咱们都知道在 Android 的每个 View 制作中有三个中心过程:Measure、Layout、Draw。详细完结是从 ViewRooTImp 类的performTraversals() 办法开端履行,Measure 和 Layout都是经过递归来获取 View 的巨细和方位,而且以深度作为优先级,能够看出层级越深、元素越多、耗时也就越长。
真实把需求显现的数据烘托到屏幕上,是经过体系级进程中的 SurfaceFlinger 服务来完结的,那么这个SurfaceFlinger 服务首要做了哪些作业呢?如下:
• 呼应客户端事情,创立 Layer 与客户端的 Surface 树立衔接。
• 接纳客户端数据及特点,修正 Layer 特点,如尺度、色彩、透明度等。
• 将创立的 Layer 内容改写到屏幕上。
• 保持 Layer 的序列,并对 Layer 终究输出做出裁剪核算。
既然是两个不同的进程,那么肯定是需求一个跨进程的通讯机制来完结数据传递,在 Android 显现体系中,运用了 Android 的匿名同享内存:SharedClient,每一个运用和 SurfaceFlinger 之间都会创立一个SharedClient ,然后在每个 SharedClient 中,最多能够创立 31 个 SharedBufferStack,每个 Surface 都对应一个 SharedBufferStack,也便是一个 Window。
一个 SharedClient 对应一个Android 运用程序,而一个 Android 运用程序或许包括多个窗口,即 Surface 。也便是说 SharedClient 包括的是 SharedBufferStack的调集,其间在显现改写机制顶用到了双缓冲和三重缓冲技能。终究总结起来显现全体流程分为三个模块:运用层制作到缓存区,SurfaceFlinger 把缓存区数据烘托到屏幕,因为是不同的进程,所以运用 Android 的匿名同享内存 SharedClient 缓存需求显现的数据来到达意图。
除此之外,咱们还需求一个名词:FPS。FPS 表明每秒传递的帧数。在抱负状况下,60 FPS 就感觉不到卡,这意味着每个制作时长应该在16 ms 以内。可是 Android 体系很有或许无法及时完结那些杂乱的页面烘托操作。Android 体系每隔 16ms 宣布 VSYNC 信号,触发对 UI 进行烘托,假如每次烘托都成功,这样就能够到达流通的画面所需的 60FPS。假如某个操作花费的时刻是 24ms ,体系在得到 VSYNC 信号时就无法正常进行正常烘托,这样就发生了丢帧现象。那么用户在 32ms 内看到的会是同一帧画面,这种现象在履行动画或滑动列表比较常见,还有或许是你的 Layout 过分杂乱,层叠太多的制作单元,无法在 16ms 完结烘托,终究引起改写不及时。
卡顿根本原因
依据Android 体系显现原理能够看到,影响制作的根本原因有以下两个方面:
• 制作使命太重,制作一帧内容耗时太长。
• 主线程太忙,依据体系传递过来的 VSYNC 信号来时还没准备好数据导致丢帧。