1.2 通过启动过程分析Android Framework
Android框架揭秘
Android源码数量极其庞大,以Android 2.2为例,除去Linux代码,代码数量大于4GB。若想理解和掌握这么庞大的Android系统,需要耗费大量的时间,付出极大的努力。并且,到现在为止,也没有相关资料对Android Frame作系统完整的讲解说明。
那么,分析Android Framework用什么方法好呢?回答这一问题之前,先回想一下我们是如何分析他人编写的程序代码的。在分析程序代码时,我们通常从程序的入口main()函数开始,一点点地理清程序流,把握程序的运行过程。同样,在分析结构庞大的Android Framework时,也要从Android平台启动过程着手。Android启动过程包含从Linux内核加载到Home应用程序启动的整个过程,依次分析这一过程,有利于我们系统地理解Android Framework运行的原理。
如图1-3所示,简单地描述了Android启动过程,本书在后续章节中讲解Android Framework初始化过程、各模块间如何相互作用等内容时,均以此图所描述的启动过程为基础。
对照图1-3 Android启动过程图,简单地讲解一下。
1.Linux内核
Android是基于Linux内核的系统平台。启动时,首先通过bootloader(系统加载器),加载Linux内核。在Linux加载启动时,与普通的Linux启动过程相同,先初始化内核,然后调用init进程。
2.init
Android init进程对各种设备进行初始化,运行Android Framework所需用的各种Daemon、Context Manager、Media Server、Zygote等。
以下是init进程执行的Daemon进程。
USB Daemon (usbd):管理USB连接。
Android Debug Bridge Daemon (adbd):Android Debug Bridge连接管理。
Debugger Daemon (debuggerd):启动Debugger系统。
Radio Interface Layer Daemon (rild):管理无线通信连接。
3.Context Manager
Context Manager是一个管理Android系统服务的重要进程。系统服务是组成Android Framework的重要组件,提供从相机、音频、视频处理到各种应用程序制作所需要的重要的API。
Context Manager提供运行于Android内的各种系统服务信息。应用程序或Framework内部模块在调用系统服务时,需要先向服务管理器申请,而后通过Binder IPC(Interprocess communication)调用系统服务。
在系统启动时,Android所有系统服务都要把各自的handle信息注册到Context Manager,此时,Binder IPC用来进行进程间的通信。
4.Media Server
Media Server用于运行基于C/C++ 的本地系统服务,如Audio Flinger(负责音频输出)、Camera等。
5.Zygote
Zygote进程用于缩短Android应用程序加载的时间,每当执行Java应用程序时,Zygote就会派生出一个子进程来执行应用程序,该子进程就是用来执行Java应用程序的虚拟机。
6.System Server
System Server是Android系统的一个核心进程,它是由Zygote进程创建的,在Android启动过程中位于Zygote之后。在System Server中可以看到它建立的Android中的大部分服务,如Activity Manager Service(管理应用程序的生命周期)、Location Manager Service(提供终端的地理位置信息)等。
为了将运行在System Server中的Java系统服务提供给Android应用程序或Framework内部模块调用,需要先将它们注册到Context Manager中。
在通过Binder IPC将Java系统服务注册到基于C语言的服务管理器时,需要使用JNI(Java Native Interface)本地编程接口。JNI允许Java代码与其他编程语言(如C、C++、汇编语言)编写的应用程序和库进行交互操作。
以上就是对Android启动过程以及Framework初始化的简单介绍。当然这仅仅是Android启动过程的一部分,如图1-3所示,当所有Java系统服务加载完毕后,Activity Manager Service会运行HOME应用,启动过程继续进行。这部分已超出本书所要讨论的范围,如果读者感兴趣,请参照Android源码进行分析。
出于篇幅的考量,本书不可能对Android Framework所有模块的所有动作作出说明。即便如此,沿着本书提供的思路,参考相关章节内容,分析相关源码,你会很快、很容易地掌握Android Framework。