家喻户晓,Android是一个基于Linux实现的操作系统。但对于Linux内核来说,Android也仅仅只是一个运行在内核之上的应用程序,与其余运行在内核之上的应用程序没有任何区别。所以Android也须要运行环境,须要Linux内核在启动实现后加载Android Framework运行所须要的资源。当Framework实现初始化后能力持续启动相应的APK应用程序。
Framework启动剖析
Framework运行的第一个Java虚拟机过程为zygote(对应具体程序为app_process,该程序位于system/bin目录下),zygote是APK应用程序的父过程,尔后所有的虚拟机过程都由zygote创立。
zygote有两个性能:
1.承受申请创立新的Dalvik过程
2.共享类和资源(须要加载的资源在preload-classes文本文件中申明)
对于Android来说,每一个应用程序对应着一个Linux 过程,每一个过程都是一个Dalvik虚拟机,Dalvik虚拟机是一种相似Java虚拟机的实现。
zygote过程在启动时会事后装载共享类和共享资源,这些类及资源实际上就是SDK中定义的大部分类和资源。当zygote过程创立新过程时,新的APK过程只需装载本身类和资源即可。共享的资源位于同一段物理内存空间中,zygote过程及其创立的Dalvik过程都能够拜访,这就解决了多个APK共享Framework资源的问题。(更多对于资源的探讨请看Android资源加载机制详解)
zygote创立的第一个过程名为SystemServer,SystemServer创立了一个Socket客户端,并创立了ActivityManagerService线程来治理该客户端。之后所有的Dalvik过程都是由该客户端启动的。当须要启动新的APK过程时,AmS会通过该Socket客户端向zygote过程的Socket服务端发送一个启动命令,而后zygote就会创立(应用fork()创立新过程)出新的应用程序过程。
零碎服务
SystemServer过程外部运行着APK利用中可能间接交互的大部分零碎服务。比方WindowManagerService(简称WmS),ActivityManagerService(简称AmS),PackageManagerService(简称PmS)等。这些零碎服务都是以一个线程的形式生存在SystemServer过程中。SystemServer启动的各种服务线程如下所示:
- PowerManagerService电源治理服务
- ActivityManagerService治理Activity
- PackageManagerService程序包治理服务
- BatteryService电池治理服务
- LightService自然光强度感应传感器服务
- VibratorService触动传感器服务
- ClipboardService剪切板服务
- NetworkManagerService网络管理服务
- InputMethodManagerService输入法治理服务
- BluetoothService蓝牙服务
- ...
Dalvik与Android Runtime(ART)
Dalvik是一品种Java虚拟机的实现,其执行的是class优化后的dex字节码文件。Dalvik通过一个JIT(Just-In-Time)编译器去解释字节码,但执行效率并不现实。
主动Android 4.4后安卓就内置了ART实现,从5.0开始更是间接摈弃了Dalvik全面应用ART。ART通过AOT机制(Ahead-Of-Time)在应程序安装时将字节码编译成机器语言,因而执行速度更快。并且ART也齐全兼容Dalvik。
应用程序启动剖析
在计算机的世界里每个程序都有一个main()办法,程序代码都是从main()办法开始执行,Android应用程序也不例外。
当应用程序启动时零碎首先会为其创立一个Dalvik虚拟机过程,并加载APK应用程序类及资源。而后,APK应用程序从ActivityThred的main()办法处开始执行。
首先main()办法为UI线程创立一个音讯队列(MessageQueue)。而后创立ActivityThread对象,ActivityThread初始化时会创立一个Handler和一个Binder。Binder负责接管近程AmS的IPC调用,接管到调用后通过Handler将音讯发送到音讯队列,UI主线程会异步地从音讯队列中取出音讯并执行相应操作,比方start,stop,pause等。
接着UI主线程调用Looper.loop()办法进入音讯循环体,进入后就会一直从音讯队列中读取并解决音讯。
ActivityThread是APK程序的UI线程,也就是咱们所说的主线程。主线程要求执行工夫不能超过5秒,超过就会报ANR,这个5秒就是UI线程音讯队列循环一次的最大工夫阈值。
当ActivityThread接管到AmS发送的start某个Activity音讯后,就会创立指定Activity对象。Activity又会创立PhoneWindow类,PhoneWindow创立DecorView,DecorView外部蕴含Activity.setContentView(R.layout.xxx)指定的布局。
创立实现后,Activity须要将布局显示在屏幕上,于是调用WindowManager.addView()办法。WindowManager为Activity对应的窗口(Window)创立一个ViewRoot对象(每一个窗口对应一个ViewRoot对象),而后调用WmS提供的近程接口将窗口(布局)显示到屏幕上。至此应用程序中的Activity就显示在屏幕上了。
APK中的线程
在当初操作系统中,任何应用程序都运行在线程之中。客户端在启动时零碎会首先为其调配一个线程,而后该线程从程序的入口处开始执行。对于蕴含Activity的客户端程序,至多蕴含三个线程:
- 主线程,又称UI线程,也就是应用程序自身所在的线程,次要用于解决用户音讯以及绘制程序界面。
- ViewRoot.W对象对应的线程,Activity启动后会创立一个ViewRoot.W对象,W对象继承自Binder,因而会启动一个对象负责接管Linux Binder驱动的IPC调用。
- ApplicationThread对象所对应的线程,该对象也继承自Binder,因而也会启动一个线程用于IPC调用。
自定义Thread与UI线程的区别
对于UI线程,在启动时曾经创立了音讯队列(MessageQueue),既在ActivityThread的main()办法中曾经应用Looper.prepareMainLooper()办法为UI线程增加了Looper对象。程序员能够间接在Activity中定义Handler对象发送解决音讯。
而对于一般线程,须要手动调用Looper.prepareLooper()办法为Thread创立音讯队列,这样能力定义Handler解决音讯。即不能间接在Thread中定义Handler。
从应用场景上说,就是不能间接给Thread对象发消息,然而却能够给UI线程发消息。
具体Handler的应用及解释请移步Android异步通信机制详解
一些重要的类:
上面是一些零碎中常见的类及其性能介绍,通读一遍会对了解Android源码很有帮忙。
两个重要的零碎服务
- WindowManagerService,治理所有的窗口,包含创立删除窗口,暗藏显示窗口,决定窗口的层级程序,指定以后正在与应用程序交互的窗口。
- ActivityManagerService,内存治理,过程治理,对立调度所有应用程序中的Activity。所有Activity的启动必须告诉AmS,AmS也决定了某个过程会不会被杀死。
两个音讯解决类
- KeyQ类:该类是WmS的外部类,继承自KeyInputQueue,一旦创立就立刻启动一个线程,该线程会一直读取用户UI操作音讯,比方按键、触摸屏、等,并把这些音讯放到一个音讯队列QueueEvent类中。
- InputDispatcherThread类:该类一旦创立也会启动一个线程,该线程会一直地从QueueEvent中读取用户音讯,并进行肯定的过滤,过滤后发送给以后流动的而应用程序中。
其余罕用类
- ActivityThread类,应用程序主线程类,所有的APK都有且仅有一个ActivityThread类,程序的入口为该类中的static main()办法,ActivityThread所在的线程即为UI线程或主线程。
- ViewRoot类,WmS治理客户端窗口时,须要告诉客户端进行某种操作,这些都是通过IPC调用来实现的,而客户端在接管到IPC后,都须要将该调用转换老本地异步调用。ViewRoot继承自Handler,其作用就是将近程接口调用转换老本地异步调用。
- W类,ViewRoot外部类,继承自Binder,Wms告诉客户端时就是该类进行IPC调用。该类外部会向其所在的ViewRoot发送一个Handler音讯,以便进行异步解决。
- Window类,是一个抽象类,提供了一套操作窗口的通用办法(Callback接口)。Activity就是通过实现这个Callback接口来取得对音讯的解决机会。因为音讯首先会由WmS传递给窗口中的View树,View树不解决音讯的话才会传递给Window,这时候就会回调Activity实现的Callback办法使Activity有机会处理事件。
- PhoneWindow类,是Window的具体实现类,其外部保留有DecorView对象。
- DecorView类,应用程序视图的根布局View,该类继承自FrameLayout。客户端应用WindowManager增加窗口就是将该类(及其子View)增加到WmS中,并将其所代表的视图绘制到屏幕上。
- Activity类,该类APK程序最小运行单元。ActivityThread依据用户的操作抉择加载哪个Activity。
- WindowManager类,该类是WindowManagerService在客户端的治理类,客户端通过WindowManager申请创立一个窗口,而具体创立窗口的工作是由WMS来实现的。
文章转自 https://www.jianshu.com/p/37e... 如有侵权,请分割删除。
相干视频:
【2021最新版】Android studio装置教程+Android(安卓)零基础教程视频(适宜Android 0根底,Android初学入门)_哔哩哔哩_bilibili
Android网络架构搭建与原理解析(一)——通过一个网络申请一步一步见证网络模块的成长_哔哩哔哩_bilibili
【 Android进阶教程】——Framework面试必问的Handler源码解析_哔哩哔哩_bilibili
【Android进阶课程】——colin Compose的绘制原理解说(一)_哔哩哔哩_bilibili
【 Android进阶教程】——热修复原理解析_哔哩哔哩_bilibili
【 Android进阶教程】——如何解决OOM问题与LeakCanary原理解析_哔哩哔哩_bilibili