Android 进阶解密读书笔记1
Android 系统五层架构
应用层
应用框架层
系统运行库层( C/C++ 库,Android 运行时库)
硬件抽象层
Linux内核层
系统是如何启动的
用一张图来总结描述 Android 系统启动.jpgzygote
Android 设备上电后,会启动引导程序,引导程序会加载启动 Linux 内核Linux 内核寻找并解析 init.rc (由 Android 初始化语言编写的脚本文件)启动 init 进程,init 进程要做的事情:
1.创建启动所需的文件目录
2.启动属性服务
3.启动 zygote 进程
要创建 zygote 进程,主要看 init.zygoteXX 文件,并且关键是解析 Service 类型语句。回到「init.rc」中,class_start main 用来启动 zygote,最后在 app_progress 中调用 app_main 启动 zygote。
「zygote」这个名词是在 Android.mk 中定义的,在进程初始化时叫 app_progress。
在 app_main 文件中的 main 方法中,会通过标识符进行进程区分,因为 zygote 及其子进程是通过 fork 创建的,都会执行 main 方法。
zygote 进程要做的事情:
1.创建 Java 虚拟机,并为虚拟机注册 JNI 方法
2.创建 Server 端 Socket 端口(用于监听 AMS 请求)
3.fork 系统服务进程(AMS 将在系统服务进程中创建)
4.监听 AMS 申请创建应用进程的请求
app_main 中的 main 方法调用启动 zygote 进程时,会创建 Java 虚拟机,并调用 ZygoteInit.java 的 main 方法,这一步使得 zygote 从 Native 层进入了 Java 层。
系统服务进程要做的事情:
1.创建 Binder 线程池。
2.创建 SystemServiceManager 用于对其他服务的管理
3.启动各种系统服务(例如 AMS)
启动系统服务进程时,会调用 ZygoteInit 的 zygoteInit 方法,里面做的事情主要是 创建 Binder 线程池,从而可以与其他进程进行通信;进入 SystemServer 的 main 方法(通过反射,抛异常的形式)。
SystemServer 的 main 方法就会去加载动态库,创建 SystemServerManager,以及启动一些系统服务等。
桌面上应用图标的展示
前面说到的 zygote 进程会等待 AMS 发起创建新应用的请求,而 AMS 会在系统服务进程启动时创建,当 AMS 创建后,便会由 SystemServer 向 AMS 发起创建「桌面应用」的请求。
从 AMS 的 systemReady 方法作为入口点,会经过 ActivityStackSupervisor,ActivityStack,最后回到 AMS,调用 startHomeActivityLocked 方法。此时就会启动 Launcher 这个 Activity 及其对应的应用
Launcher 是以「工作区」的概念来管理所安装的应用,一个工作区就是一页桌面(就是我们平常可左右滑动的页面),一页上面可以放固定个数的应用图标。不过对于将多个应用合并成一个文件夹的样式,是不是说明固定单元上不仅可以用来展示具体应用图标,也可以是文件夹样式。
最后 Launcher 最终的实现大致思路是通过 PMS 获取已安装的应用信息,通过 RecyclerView 列表加载展示。