当我开始研究安卓系统组件时,我想知道从哪里开始。我能够确定几个实际构成安卓栈的组件。我经常不清楚哪个组件负责什么。经过一些研究和实验,我得到了答案,所以我想在这里分享一下,供其他寻找信息的人参考。
以下可以称为安卓的系统组件:
Binder是在安卓的Linux中用于IPC的主要组件。它取代了Linux的传统D-Bus,提供了一个用于进程间通信的平台。安卓为应用程序开发者提供了IPC机制,如Intents、IBinder、AIDL机制和messenger,这些机制在应用程序层面上内部都使用Binders。需要注意的是,这里的Binder指的不是应用程序层常说的Binder,而是作为底层Linux一部分集成的Binder驱动程序。
Binder作为Linux内核的一部分加载。当Binder需要发送或接收数据时,它会写入或读取驱动程序文件。具体的代码实现可以在binder.c
文件中找到。
服务管理器是安卓框架中不可或缺的主要组件。它是安卓系统服务的中央注册表,持有Binder ID 0,也称为魔术数。服务管理器在系统启动的init.rc脚本中启动,是系统中必须最先加载的组件。系统服务在启动时注册自己到服务管理器,形成一个注册表。
当服务管理器启动时,它在Binder中注册自己作为上下文管理器。以下是来自service_manager.c
主函数的代码片段:
if (binder_become_context_manager(bs))
{
LOGE(“cannot become context manager (%s)\n”, strerror(errno));
return -1;
}
以下是来自binder.c
的代码片段:
int binder_become_context_manager(struct binder_state *bs)
{
return ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);
}
在注册时,可以看到魔术数‘0’,因此服务管理器将始终具有Binder ID 0。
Zygote是一个具有重要责任的组件,也是从init.rc
脚本启动的。它启动一个虚拟机并保持一个套接字打开。当用户启动应用程序时,ApplicationManager
服务通过套接字通知Zygote,Zygote为启动的应用程序分叉出一个虚拟机。因此,安卓中的每个应用程序都将在独立的虚拟机上运行。
Android运行时类似于JVM(PC上的Java虚拟机)和DVM(Dalvik虚拟机)。不同之处在于,JVM和DVM是JIT(即时)编译器,而Android运行时是AOT(预先)编译器。这意味着Android运行时在应用程序安装时将.dex(Dalvik可执行)文件编译为.oat(提前)文件。虽然AOT在加载应用程序时更快,但作为缺点,应用程序需要更多的空间进行安装。
系统服务是一组托管所有系统服务、媒体服务和电话服务的进程的术语。这些系统服务(约70个)都在‘system_server’进程下运行。其中两个重要的系统服务是ActivityManager服务和PackageManager服务,通常被称为‘am’和‘pm’。系统服务包括用Java和C/C++编写的服务。这些服务不同于由应用程序开发者通过扩展框架的Service类编写的应用程序服务。系统服务在启动时注册到服务管理器中,当任何进程要与它们通信时,Binder就会从中获取它们。媒体服务属于系统服务器,但它们在自己的进程中运行,使用C++编写。电话服务也有自己的进程。