Linux 内核映像通常包括两部分代码,分别为实模式代码和保护模式代码。当 BootLoader 装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行完成后转入保护模式代码。
实模式和保护模式的概念再次不做过多解释,读者可以自行查阅资料。
当系统内核加载完成之后,会首先启动 Init 守护进程,它是内核启动的第一个用户级进程,它的进程号总是 1。Init 进程启动完成之后,还负责启动其他的一些重要守护进程,包括:
Usbd 进程(USB Daemon):USB 连接后台进程,负责管理 USB 连接。
adbd 进程(Android Debug Bridge Daemon):ADB 连接后台进程,负责管理 ADB 连接。
debuggerd 进程(Debugger Daemon) :调试器后台进程,负责管理调试请求及调试过程。
rild 进程 (Radio Interface Layer Daemon):无线接口层后台进程,负责管理无线通信服务。
Init 进程和一些重要的守护进程启动完成之后,系统启动 Zygote 进程。Zygote 进程启动后,首先初始化一个 Dalvik VM实例,然后为它加载资源与系统共享库,并开启 Socket 监听服务,当收到创建Dalvik VM 实例请求时,会通过COW(copy on write)技术最大程度地复用自己,生成一个新的Dalvik VM 实例。Dalvik VM 实例的创建方法基于 linux 系统的 fork 原理。
其实,我个人理解,Zygote 进程就相当于Linux系统中的 fork 进程。由它可以在系统运行期间,接收到创建虚拟机请求时,孵化 Dalvik VM实例。Zygote 进程孵化 Dalvik VM 实例流程如下图所示:
图1 Zygote进程孵化Dalvik VM实例流程
在 Zygote 进程启动完成之后,Init 进程会启动 Runtime 进程。Runtime 进程首先初始化服务管理器(Service Manager),并把它注册为绑定服务(Binder services)的默认上下文管理器,负责绑定服务的注册与查找。然后 Runtime 进程会向 Zygote进程发送启动系统服务(System Service)的请求,Zygote 进程收到请求后,会“孵化”出一个新的 Dalvik VM 实例并启动系统服务进程。Runtime 进程的启动流程如下图所示:
图2 Runtime进程启动流程图
System Service 会首先启动两个本地服务(由C或C++编写的native服务),Surface Flinger 和Audio Flinger,这两个本地系统服务向服务管理器注册成为 IPC 服务对象,以便在需要它们的时候很容易查找到。然后 SystemService 会启动一些 Android 系统管理服务,包括硬件服务和系统框架核心平台服务,并注册它们成为 IPC 服务对象。本地服务进程的启动流程如下图所示:
图3 SystemService启动本地服务流程图
当 SystemService 加载了所有的系统服务后就意味着系统就准备好了,它会向所有服务发送一个系统准备完毕(systemready) 广播。SystemService 系统服务进程的启动流程如图3所示。当ActivityManagerService 接收到 systemready 广播后,会向Zygoute进程发送创建Dalvik 虚拟机实例的请求,Zygoute 进程会负责生成一个新的 Dalvik 虚拟机实例,然后 ActivityManagerService 在系统中查找具有属性的Activity,并启动它。ActivityManagerService 同时也会使用同样的方法启动 Contact 应用程序。
图4 启动Home Laucher流程图
====================================================================
Android应用安装有如下四种方式:
1.系统应用安装――开机时完成,没有安装界面
2.网络下载应用安装――通过market应用完成,没有安装界面
3.ADB 工具安装――没有安装界面。
4.第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由 packageinstaller.apk 应用处理安装及卸载过程的界面。
应用安装的流程及路径
应用安装涉及到如下几个目录:
system/app :系统自带的应用程序,获得adb root权限才能删除
data/app :用户程序安装的目录。安装时把 apk文件复制到此目录
data/data :存放应用程序的数据
data/dalvik-cache:将 apk中 的 dex 文件安装到 dalvik-cache 目录下(dex 文件是 dalvik 虚拟机的可执行文件,其大小约为原始 apk 文件大小的四分之一)
安装过程
复制 APK 安装包到 data/app 目录下,解压并扫描安装包,把 dex 文件(Dalvik字节码)保存到 dalvik-cache 目录,并在 data/data 目录下创建对应的应用数据目录。
====================================================================
这里以启动微信为例子说明
-
Launcher 通知 AMS 要启动微信了,并且告诉AMS要启动的是哪个页面也就是首页是哪个页面。
-
AMS 收到消息告诉 Launcher 知道了,并且把要启动的页面记下来。
-
Launcher 进入Paused状态,告诉 AMS,你去找微信吧。
上述就是 Launche r和 AMS 的交互过程
-
AMS 检查微信是否已经启动了也就是是否在后台运行,如果是在后台运行就直接启动,如果不是,AMS 会在新的进程中创建一个ActivityThread 对象,并启动其中的 main 函数。
-
微信启动后告诉 AMS,启动好了。
-
AMS 通过之前的记录找出微信的首页,告诉微信应该启动哪个页面。
-
微信按照AMS通知的页面去启动就启动成功了。
========================================================================
Activity 启动过程是由 ActivityMangerService(AMS) 来启动的,底层 原理是 Binder实现的 最终交给 ActivityThread 的 performActivity 方法来启动它
ActivityThread 大概可以分为以下五个步骤
-
通过 ActivityClientRecoed 对象获取 Activity 的组件信息
-
通过 Instrument 的 newActivity 使用类加载器创建 Activity 对象
-
检验 Application 是否存在,不存在的话,创建一个,保证 只有一个 Application
-
通过 ContextImpl 和 Activity 的 attach 方法来完成一些初始化操作
-
调用 oncreat 方法。
总结
Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
【Android高级架构视频学习资源】
Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!