android性能优化
四个方面总结如下:
稳定(内存溢出、崩溃)
流畅(卡顿)
耗损(耗电、流量)
安装包(APK瘦身)
一稳定——内存优化
内存分析工具:
Android Profiler:
(1)、CPU分析器CPU Profiler:CPU分析器可帮助您实时检查应用程序的CPU使用情况和线程活动,并记录方法跟踪,以便您可以优化和调试应用程序的代码。
(2)、内存分析器memory profiler:记录内存分配
Java表示Java代码或Kotlin代码分配的内存;
Native表示C或C++代码分配的内存(即使App没有native层,调用framework代码时,也有可能触发分配native内存);
Graphics表示图像相关缓存队列占用的内存;
Stack表示native和java占用的栈内存;
Code表示代码、资源文件、库文件等占用的内存;
Others表示无法明确分类的内存
(3)、网络分析器(Network Profiler):网络分析器在时间轴上显示实时网络活动,显示发送和接收的数据,以及当前连接的数量。这让您可以检查应用程序如何和何时传输数据,并适当地优化底层代码。
2、内存泄漏优化,LeakCanary工具检测泄漏
3、内存抖动是指内存在短时间内频繁地分配和回收,而频繁的gc会导致卡顿,严重时和内存泄漏一样会导致OOM。
常见的内存抖动场景:
(1)循环中创建大量临时对象,列表中的convertView中创建大量对象;
(2)onDraw中创建Paint或Bitmap对象等;
4、避免滥用Bitmap导致的内存浪费,记住recycle
二、流畅——交互优化
用户体验最直接的方面,交互场景大概分为四个部分:UI 绘制、应用启动、页面跳转、事件响应(网络请求)
用户在 32ms 内看到的会是同一帧画面,无法在 16ms 完成渲染,最终引起刷新不及时。两个根本原因:
1、绘制任务太重,绘制一帧内容耗时太长。
2、主线程太忙,根据系统传递过来的 VSYNC 信号来时还没准备好数据导致丢帧。
建议1:布局优化,提高显示速度,使用<ViewStub>延迟View加载;减少层级,使用<merge>标签替换父级布局;删除控件中无用属性;使用ConstraintLayout约束布局减少嵌套
建议2:绘制优化,布局上的优化。移除 XML 中非必须的背景,自定义View优化。使用 canvas.clipRect()来帮助系统识别那些可见的区域,只有在这个区域内才会被绘制
建议3:加载逻辑优化。可以采用异步加载、延期加载策略来提高应用启动速度
建议4:借助开发者工具,如GPU Rendering,过度绘制检测、显示布局边界分析布局
建议5:BlockCanary监听卡顿
Android丢帧分析与优化
60fps:人眼与大脑之间的协作无法感知超过60fps的画面更新。
*16ms:因为Android设定的刷新率是60fps,也就是每秒60帧,即16ms=1000/60Hz
Android系统每隔16ms会发出VSYNC信号重绘我们的界面
双缓冲:实际上帧的数据就是保存在两个缓冲区中,A缓冲用来显示当前帧,那么B缓冲就用来缓存下一帧的数据,这样就可以做到一边显示一边处理下一帧的数据
丢帧监听:通过Choreographer检测UI丢帧和卡顿,记录上一次和下一次绘制的时间间隔,如果超过16ms,就意味着一次UI线程重绘的“丢帧”。丢帧的数量为间隔时间除以16,如果超过3,就开始有卡顿的感知。
三、瘦身:
代码混淆:使用proGuard 代码混淆器工具,它包括压缩、优化、混淆等功能。
资源优化:使用 Android Lint代码审查, 删除冗余资源,资源文件最少化等。
图片优化:图片使用WebP,减少内存消耗,可以对图片做压缩处理,降低图片色彩位数等。
四、电量
网络请求、gps、Battery Historian是Android5.0之后Google开源的一款用于检测与电池有关的信息和事件的工具,从设备中收集电池数据,然后使用Battery Historian可以可视化分析相关指标如耗电比例、Wifi、蜂窝数据量、WakeLock唤醒次数通过Battery Historian可以方便的看到各耗电模块随着时间的耗电情况
冷启动的优化
冷启动就是在启动应用前,系统中没有该应用的任何进程信息。
热启动就是用户使用返回键退出应用,然后马上又重新启动应用。
Application只初始化一次,冷启动会先创建Application,然后初始化MainActivity,热启动会直接初始化MainActivity。
冷启动流程:
1、Zygote进程中fork创建一个新的进程。
2、创建和初始化Application类,创建MainActivity类
3、inflate布局,当onCreate/onStart/onResume方法都走完。
4、调用setContetView方法后,将view添加到DecorView中,调用view的measuer/layotu/draw显示到界面上。
减少冷启动的时间进行优化:
1、减少onCreate方法的工作量,第三方sdk的使用最好使用懒加载方式,当前有些困难
2、不用再Application进行耗时操作。
3、不要以静态变量的方式在Application中保存数据。
4、减少布局的深度
合理管理内存
1、当界面不可见时释放内存,只需要在Activity中重写onTrimMemory()方法,然后在这个方法中监听TRIM_MEMORY_UI_HIDDEN这个级别,一旦触发了之后就说明用户已经离开了我们的程序,那么此时就可以进行资源释放操作了
2、当内存紧张时释放内存,根据onTrimMemory()回调中传入的级别来去决定如何释放应用程序的资源
3、避免在Bitmap上浪费内存
4、使用优化过的数据集合如SparseArray(稀疏数组整形到对象的映射),SparseBooleanArray,以及LongSparseArray等,sparseArray它比HashMap在内存上更有效率,用二分查找算法查找元素, 不宜用在含有大量数据项的数据结构
5、尽量避免使用依赖注入框架,这些框架为了要搜寻代码中的注解,通常都需要经历较长的初始化过程,并且还可能将一些你用不到的对象也一并加载到内存当中。这些用不到的对象会一直占用着内存空间,可能要过很久之后才会得到释放,相较之下,也许多敲几行看似繁琐的代码才是更好的选择
6、使用ProGuard简化代码,ProGuard会对我们的代码进行检索,删除一些无用的代码,并且会对类、字段、方法等进行重命名,重命名之后的类、字段和方法名都会比原来简短很多,这样的话也就对内存的占用变得更少了
7、节制地使用Service,系统会倾向于将这个Service所依赖的进程进行保留,这样就会导致这个进程变得非常消耗内存
网友评论