Android 性能优化

性能优化,大概包含 ANR,内存溢出, 内存抖动,内存泄漏,UI卡顿,冷启动优化等方面来回答

ANR

主线程被IO操作阻塞 (4.0网络IO不允许在主线程中)

主线程做了耗时任务超过5秒

Service做了耗时操作超过20秒,这是由于Service默认执行在主线程,可以使用IntentService,

BroadcastReceiver的onReciver做了耗时操作超过10秒

解决方式:

开一个子线程,使用Handler来处理.

使用AsyncTack来处理耗时的操作

内存溢出

内存溢出主要是因为图片的加载过大或者加载的信息过多而引起的,

解决方式:

1.  及时释放bitmap,调用.recycler(Bitmap会占用java内存和c(native)内存,java内存会自动释放,c内存需要手   动释放)。

2.   使用lru 最近最少使用

      LruCache来存储对象put(key,value),,使用的使用LinkHashMap()。

3.  计算inSampleSize

      官方提供的方法,使用BitmapFactory.Options来计算inSampleSize(图片的缩略比)

  4. 缩略图

使用Options的inJustDecodeBounds属性来处理加载缩略图

  5. 三级缓存

内存,本地,网络。


内存抖动

内存抖动是指内存在短时间内频繁地分配和回收,而频繁的gc会导致卡顿,严重时和内存泄漏一样会导致OOM。

常见的内存抖动场景:

循环中创建大量临时对象;

onDraw中创建Paint或Bitmap对象等;

内存抖动的原因:

瞬间产生大量的对象会严重占用新生代的内存区域,当达到阀值,剩余空间不够的时候,就会触发GC。系统花费在GC上的时间越多,进行界面绘制或流音频处理的时间就越短。即使每次分配的对象占用了很少的内存,但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC。这个操作有可能会影响到帧率,并使得用户感知到性能问题。


内存泄漏

内存泄漏是指无用对象(不在使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄漏。


UI卡顿

1.在UI线程中做轻微耗时操作,会导致UI线程卡顿

2.布局Layout过于复杂,无法再16ms内完成渲染

60fps-->16ms

60ms一帧  每过16ms就会更新一下ui,要达到60ms一帧,否则可能会卡顿

3.同一时间动画执行的次数过多,导致cpu或gpu负载过重。

4.View过度绘制,导致某些像素在同一时间内被绘制多次,从而导致cpu,gpu负载过重。

overdraw

过度绘制,

5.view频繁的触发measure。layout,导致measure。layout累计耗时过多以及整个view频繁的重新渲染

6.内存频繁触发Gc过多,导致展示阻塞渲染操作

7.屯余资源及逻辑导致加载和执行缓慢

解决ui卡顿:

1.布局优化 include,merge,viewsuble

2.背景和图片等内存分配优化

内存优化


内存管理

1. 分配机制

为每一个进程分配一个小额的内存,然后根据需要分配更多内存。

2. 回收机制

Android的目的是尽可能的运行多个进程,这样可以让用户不用每次都重新开启,而是恢复。当内存紧张时会按等级杀死进程。前台进程>可见进程>服务进程>后台进程(lru)>空进程。

优化方法:

1.当Service完成任务后,尽量停止它。

2.在UI不可见的时候,释放掉一些只有UI使用的资源

3.在系统内存紧张的时候,尽可能多的释放掉非重要的资源。

4.避免滥用Bitmap导致的内存浪费。

5.尽量使用少的依赖注入框架



冷启动的优化

冷启动就是在启动应用前,系统中没有该应用的任何进程信息。

热启动就是用户使用返回键退出应用,然后马上又重新启动应用。

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. 不要以静态变量的方式在Application中保存数据。

5. 减少布局的深度

性能优化工具

android Studio 中 Android Monitor

更多详细的参考:Android性能优化篇之内存优化--内存泄漏 - 简书

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。