1,android发动流程

Android启动速度优化

1,点击桌面App图标,Launcher进程选用Binder向system\_server进程发送startActivity进程间通讯
2,System\_server进程中的AMS服务获取到startActivity恳求后,经过Socket发送创立进程的恳求到Zygote进程
3,Zygote进程fork出新的子进程,即App进程
4,App进程,经过Binder IPC向system\_server发送attach Application恳求
5System——server进程在收到恳求后,进行一系列代码调用最终向App进程发送scheduleLaunchActivity恳求
6,App进程的binder线程(ApplicationThread)向主线程经过handler.LAUNCH\_ACTIVITY发送音讯
7,主线程在收到Message后,经过反射机制创立handleLauchActivity.onCreate()等办法
8,至此,App便正式发动,开端进入Activity生命周期,履行完onCreate/onStart/onResume办法,UI烘托完毕后便能够看到App的主界面

Android启动速度优化

2,App的发动状况

运用有三种发动状况,每种状况都会影响运用向用户显现所需的时刻:冷发动、温发动与热发动

冷发动是指运用从头开端发动:体系进程在冷发动后才创立运用进程,发生冷发动的状况包含运用自设备发动后或体系终止运用后初次发动

热发动,在热发动中,体系的所以工作就是将Activity带到前台,只要运用的所以Activity仍主流在内存中,运用就不必重复履行目标初始化、布局加载和制作

温发动包含了冷发动期间发生的部分操作;一起它的开销比热发动高,有许多潜在状况可视为温发动,例如

用户在退出运用后又重新发动运用,进程或许未销毁,持续运转,但运用需求履行onCreate()从头开端创立Activity

体系将运用从内存中开释,然后用户又重新发动它,进程和Activity需求重启,但传递onCreate()的已保存的实例savedinstanceState关于完结此使命有一定助益

发动耗时计算

Adb指令发动运用,一般会输入三个值:ThisTime、TotalTime与WaitTime

WaitTime:包含前一个运用Activity pause的时刻和新运用发动的时刻
ThisTime:表明一连串发动Activity的最后一个Activity的发动耗时
TotalTime:表明新运用发动的耗时,包含新进程的发动和Activity的发动,但不包含前一个运用Activity pause的耗时

Android启动速度优化

Android启动速度优化

Android启动速度优化

CPU Profile

Call chart 依据时刻线检查调用栈,便于调查每次调用是何时发生的
Flame Chart: 依据耗时百分比检查调用栈,便于发现总耗时很长的调用链
Top Down Tree:检查记载数据中所有办法调用栈,便于调查其间每一步耗费的准确时刻
Bottom Up Tree:相关于Top Down Tree,能够更便利检查耗时办法怎么被调用

发动优化相关

合理的运用异步初始化、延迟初始化、懒加载机制
发动进程防止耗时操作,如数据库I/O操作不要放在主线程履行
类加载优化:提早异步履行类加载
合理运用IdieHandler进行延迟初始化
简化布局

布局优化

层级优化 Measure、layout、draw这三个进程都包含自顶向下的view tree遍历耗时,假如视图层级太深自然需求更多的时刻来完结整个测绘进程,然后形成发动速度慢、卡顿等问题,而onDraw在频频改写时或许屡次动身,因此onDraw更不能做耗时操作,一起需求注意内存颤动,关于布局功用的检测,仍然能够运用systrace与traceview依照制作流程检查制作耗时函数

Layout Inspector

在较早的年代SDK中有一个hierarchy viewer东西,可是早在Android studio3.1配套的SDK中就已经被弃用,现在应在运转时改用Layout Inspector来检查运用的视图层次结构

运用merge标签

当咱们有一些元素需求被多处运用时,这时咱们会考虑将其抽取成一个独自的布局文件,在需求运用的当地经过inClude加载

Android启动速度优化

ViewStub标签

ViewStub标签的作用是用于懒加载布局,当体系碰到ViewStub标签的时分是不进行制作处理(如measure、layout等),比设置View躲藏、不行见更高效

过度烘托

过度制作是指体系再烘托单个帧得进程中屡次再屏幕上制作某一个像素,例如,假如咱们有若干界面卡片堆叠再一起,每张卡片都会遮盖其下面一张卡片得部分内容,可是,体系仍然需求制作堆叠中得卡片遮盖得部分

CPU过度制作检查

手机开发者选项中能够显现过度烘托检查功用,经过对界面进行五颜六色编码来帮咱们辨认过度制作

1,进入开发者选项(Developer Options)
2,找到调试CPU过度制作(Debug GPU overdraw areas)
3,在弹出得对话框中,选择显现过度制作区域(Show overdraw areas)

Android将按如下方式为界面元素着色

    真五颜六色:没有过度制作
    蓝色:过度制作1次
    绿色:过度制作2次
    粉色:过度制作3次
    红色:过度制作4次或许更屡次

卡顿与布局优化

Systrace

Systrace是android平台供给得一款东西,用于记载短期内得设备活动,该东西会生成一份陈述,其间汇总了android内核中的数据,例如CPU调度程序、磁盘活动和运用线程。Systrace首要用来剖析制作功用方面的问题,在发生卡登时,经过这份爆改能够只当当前整个体系所在的状况,然后协助开发者更直观的剖析体系瓶颈,改进功用

TraceView能够看出代码在运转时的一些详细信息,办法调用时长、次数、时刻比率,了解代码运转进程的效率问题,然后针对性改进代码,所以或许导致卡顿的耗时办法也能够经过TraceView检测

要运用Systrace,需求先装置Python,装置完结后装备环境变量path,随后在指令行输入:python –version,进行验证

Systrace详细运用能够检查博客:www.jianshu.com/p/e73768e66…

履行Systrace能够选择自己感兴趣的category

gfx:Graphis图形体系,包含SerfaceFlinger,VSYNC音讯,Texture,RenderThread等
input:input输入体系,按键或许触摸屏输入,剖析滑动卡顿等
viewview制作体系的相关信息,比方onMeasure,onLayout等,剖析View制作功用
am:ActivityManager调用的相关信息,剖析Activity的发动,跳转
dalvik:虚拟机相关信息,剖析虚拟机行为,如GC停顿
sched:CPU调度的信息,能看到CPU在每个时刻段在运转什么线程,线程调度状况,锁信息
disk:IO信息
wm:WindowManager的相关信息
res:资源加载的相关信息

其实Systrace关于运用开发者来说,能看的并不多,首要用于看是否丢帧,与丢帧时体系以及咱们运用大致的一个状况

Android启动速度优化

Android启动速度优化

咱们在抓取systrace文件的时分,切记不要抓取太长时刻,也不要太多不同操作

代开抓取的html文件,能够看到咱们运用存在非常严重的掉帧,不借助东西直接用肉眼看到运用UI是看不出来的,假如只是独自存在一个红色或许黄色的都是没有关系的,关键是连续的红/黄色或许两帧距离非常打那就需求咱们去仔细调查,按“W”放大视图,在UIThread主线程上面有一条很细的线,表明线程状况

Systrace会用不同的颜色来标识不同的线程状况,在每个办法上面都会有对应的线程来标识现在线程所在的状况,经过检查线程状况咱们能够知道现在的瓶颈是什么,是CPU履行慢仍是由于Binder调用,又或是进行IO操作,又或是拿不到CPU时刻片,经过检查线程状况咱们能够知道现在瓶颈是什么,是CPU履行慢仍是由于Binder调用,又或是进行IO操作,又或是拿不到CPU时刻片

线程状况首要有下面几个

绿色:表明正在运转
    是否频率不行(CPU处理速度)
    是否跑在了小核上?(不行控,但实际上许多手机都会有游戏模式,假如咱们运用是手游,那体系会优先把手游中的使命放到大核上跑)
蓝色:表明能够运转,可是CPU在履行其他线程
    是否后台有太多的使命在跑?Runable状况的线程状况持续时刻越长,则表明CPU的调度越忙,没有及时处理到这个使命
    没有及时处理是由于频率太低?
紫色:表明休眠,一般表明IO

App层面监控卡顿

systrace能够让咱们了解运用所在的状况,了解运用由于什么原因导致的,若需求准确剖析卡顿发生在什么函数调用,资源占用状况怎么,现在首要有两种有效的app监控方式

1,利用UI线程的Looper打印的日志匹配
2,运用Choreographer.FrameCallback

经过ChoreographerHelper能够实时计算帧率和掉帧数,实时监测App页面的帧率数据,发现帧率过低,还能够主动保存现场仓库信息

Looper比较适合在发布前进行测验或许小范围灰度测验然后定位问题,ChoreographerHelper适合监控线程环境的app的掉帧状况来计算app在某些场景的流畅度然后又针对性的做功用优化

Android启动速度优化

Looper日志检测卡顿

Android主线程更新UI,假如界面1秒改写至少60次,即FPS小于60,用户就会发生卡顿感觉,简单来说,Android运用音讯机制进行UI更新,UI线程有个Looper,在其loop办法中会不断取出message,调用其绑定的Handler在UI线程履行,假如在handler的dispatchMessage办法里有耗时操作,就会发生卡顿