一.UI卡顿
1.UI卡顿的原理:
<1>.安卓系统每隔16毫秒,它会发送信号,触发对UI进行渲染. 不过每次渲染都成功,这样就能达到流畅的画面所需要的60fps,也就是每秒60帧,为了能够实现60fps,就意味着程序的大多数操作必须在16毫秒内完成,比如有时候执行一些动画,或者滑动,会出现一些卡顿和不流畅,这就是因为这里的操作很复杂,然后产生优顿现象,最终导致了卡顿,有很多造成卡顿的原因,比如:item和layout用的太过复杂,16毫秒内无法完成渲染,也有可能是item上用了太多background,太多的imageview,还有可能是动画执行的过多,这些都会造成CPU和GPU的负载过度,同时,每一次打bug虚拟机,禁用jc的时候,所有的线程它都会暂停,当jc完的时候,所有的线程才能继续执行,也就是说,当这个16毫秒内进行渲染的时候,这个时候如果遇到了大量的jc操作,就会导致渲染时间不够,从而导致卡顿问题.大量的jc也会造成内存抖动.
<2>.overdraw(过度绘制):
它的意思是在屏幕上和某个像素在同一帧的时间内,被绘制了很多次,经常出现在多层次的UI
结果里边.overdraw出现的原因是UI布局中有大量的重复的布局.
2.UI卡顿原因分析:
<1.>人为在UI线程中做轻微耗时操作,导致UI线程卡顿;
<2.>布局Layout过于复杂,无法在16毫秒内完成渲染;
<3.>同一时间动画执行的次数过多,导致CPU或GPU负载过度;
<4.>View过度绘制,导致某些像素在同一帧时间内被绘制多次,从而使CPU或GPU负载过度;
<5.>View频繁的触发measure,layout,导致measure,layou累计耗时过多及整个View频繁的重新渲染;
<6.>内存频繁触发gc过多,导致暂时阻塞渲染操作;
<7.>冗尘余资源及逻辑等导致加载和执行缓慢
3.UI卡顿优化总结:
<1.>布局优化
<2.>列表及Adapter优化
<3.>背景和图片等内存分配优化
<4.>避免ANR
二.冷启动:
1.冷启动的定义:冷启动就是在启动应用前,系统中没有该应用的任何进程信息启动的方式.
热启动的定义:用户使用返回键退出应用,然后马上又重新启动应用
2. 冷启动和热启动的区别:
冷启动需要重新启动应用,所以先走Application这个类,然后再走Activity之类的类,
而热启动是保留了原有的进程,当热启动的时候,就不用走Application这个类了.
3.冷启动时间的计算:
这个时间值从应用启动(创建线程)开始计算,到完成视图的第一次绘制(即Activity内容对用户可见)为止.
4. 冷启动流程:
Zygote进程中fork创建出一个新的进程;
创建和初始化Application类,创建MainActivity类;
inflate布局,当onCreate/onStart/onResume方法都走完,contenView的measure/layout/draw显示在界面上.
Application的构造器方法 - ->attachBaseContext() - ->onCreate() - ->Activity的构造方法 - ->onCreate() - ->配置主题中背景等属性 - ->onStart() - ->onResume() - ->测量布局绘制显示在界面上.
5. 如何对冷启动的时间进行优化:
<1.>减少onCreate()方法的工作量
<2.>不要让Application参与业务的操作
<3.>不要在Application进行耗时操作
<4.>不要以静态变量的方式在Application中保留数据
<5.>布局/mainThread
三.内存管理:
1. 内存管理机制概述:
从操作系统来讲,内存就是一个数据存储区域,而且,他是属于可以被操作系统掉住的资源,
在现代的多进程操作系统当中,内存管理十分重要.
<1.>分配机制
操作系统它会为每一个进程分配一个合理的内存大小,从而,才能保证每一个进程能够正常的运行,避免了每个进程用太多的内存
<2.>回收机制
在系统内存不足的时候,它会有一个合理的回收而再生的机制,从而才能保证新的进程正常运行.
2. Android内存管理机制:
<1.>分配机制
Android为每一个进程分配内存的时候,它会采用一个弹性的分配方式,也就是说,一开始,不会为这个app分配太多的内存,而是他给每一个app进程分配一个小额的量,而这个小额的量是根据每一个移动端设备实际的物理尺寸大小决定的,当app当前内存不够使用的时候,这时候Android就会为每一个进程分配额外的内存大小,当然,分配的内存大小不是随意分配的,它是有限制的,所有系统不可能为每一个app进程分配无限大小内存.
Android系统的分配机制,它的最大限度就是要更多的进程存活在内存当中,这样的话,当用户再次启动该app进程的时候,他就不需要重新创建进程,它只需要恢复已有的进程就可以了,这样就减少了应用启动的时间,提高了用户的体验.
<2.>回收机制
Android它会在内存中保存尽可能多的数据,当有些进程不在使用了,但是它的数据还保存在内存当中,所以说,Android现在不推荐直接退出应用,因为,当用户下次启动应用的时候,只需要恢复当前进程就可以了,而不需要创建新进程,这样就减少了应用启动时间,那么,当Android发现内存不够使用的时候,需要回收内存的时候,Android就会杀死其它所有进程,开启新的进程.
Android进程分配有一个优先级的概念, Android主要分为五个进程:第一个是前台进程,在屏幕当中显示的进程;第二个是可见进程,就是前台进程不在属于前台了,用户还能看见的进程,第三个是服务进程,就是它会开启一些服务,比如说定位,推送服务等;第四个是后台进程,不同于服务进程,它是在后台进行一些计算进程;第五个是空进程,它是没有任何东西,在内存中运行的进程,内存可以随时把它回收掉. 同时,优先级越低的进程,它被系统杀死回收的概率叶越大,当然,前台进程,可见进程,服务进程在正常情况下,是不会被系统杀死的,而后台进程,它会被存放在一个缓存列表当中,就是最近最少使用的一个缓存方式,先杀死的进程它处于这个列表的尾部.最后,当Android杀死进程的时候,系统会判断每一个进程杀死后带来的回收效益,因为Android总是倾向于杀死一个能回收更多内存的进程,在这里,就可以知道,可以杀死更多进程来获取更多内存.
3. 内存管理机制的特点:
<1.>更少的占用内存;
<2.>在合适的时候,合理的释放系统资源;
<3.>在系统内存紧张的情况下,能释放掉大部分不重要的资源,来为Android系统提供可用的内存
<4.>能够很合理的在特殊生命周期中,保存或还原重要数据,以至于系统能够正确的重新恢复该应用
4.内存优化方法:
<1.>当Service完成任务后,尽量停止它
<2.>当UI不可见的时候,释放掉一些只有UI使用的资源
<3.>在系统内存紧张的时候,尽可能多的释放掉一些非重要资源
<4.>避免滥用Bitmap导致的内存浪费
<5.>使用针对内存优化过的数据容器
<6.>避免使用依赖注入的框架
<7.>使用ZIP对齐的APK
<8.>使用多线程
四.其他优化:
1. Android尽量不要用静态变量存储数据
<1.>静态变量等数据由于进程已经被杀死而被初始化;
<2.>如果乙丁要传递数据,使用其他数据传递方式:文件/sp/contentProvider;
2. 有关sp的安全问题
<1.>不能跨进程同步
<2.>存取sp的文件过大问题(它是保存的是配置性的数据,而不是存储内存大的数据,它能存储的数据类型是比较狭窄的),所以,一定要控制好存储sp数据的大小
3. 内存对象序列化
序列化:将对象的状态信息转换为可以存储或传输的形式的过程
<1.>Serializeable是java的序列化方式,Parceable是Android特有的序列化方式
<2.>在使用内存的时候,Parceable比Serializeable性能高
<3.>Serializeable在序列化的时候,会产生大量的临时变量,从而引起频繁的gc
<4.>Parceable不能使用在要将数据存储在磁盘上的情况
4.避免在ui线程中做繁重的操作