鸟人的Android揭秘(2)——通过启动过程分析 Android Framework

可紊 提交于 2020-03-02 07:24:53

      Android源代码数量极其庞大,以最新的 Android 7.1 为例,代码数量超过 50G。若想理解和掌握如此庞大的 Android 系统,将需要耗费大量的时间和精力,付出极大的努力。关键是到目前为止也没有相对完整的资料对 Android Framework 作系统性讲解说明。

那么,我们应该如何去分析 Android Framework 的代码呢?回答这个问题之前,先回想一下通常我们是如何分析他人编写的代码。在分析代码时,一般来说我们都会从程序的入口 main 函数开始,一点一点地理清程序的流程,掌握程序运行的过程。同样的,在分析结构庞大的 Android Framework 代码时,我们也要从 Android 平台的启动过程入手。 Android 启动过程包含从 Linux 内核加载到 Android Runtime 启动再到 Launcher 应用启动的整个过程,依次分析这一过程,有利于我们系统地理解 Android Framework 运行的原理。

       如下图所示简单描述了 Android 的启动过程,后续章节所讲解 Android Framework 的初始化过程和各模块之间如何相互作用乖内容时,均以此图所描述的启动过程为基础。

 

      以下对照图简单地讲解一下。

      1. Linux 内核

      Android 是基于 Linux 内核的系统平台。启动时,首先通过 bootloader (系统加载器)加载 Linux 内核。在 Linux 加载启动时,与普通的 Linux 启动过程相同,先初始化内核,然后调用 init 进程。

      2. Init

      Android init 是内核启动后创建的第一个用户空间进程,负责对各种设备进行初始化,运行 Android Framework 所需用的各种 Daemon、Context Manager、Media Server、Zygote等。

      以下是 init 进程启动的 Daemon 进程:

  • UEvent Daemon (ueventd):监听内核发出的uevent创建相应的设备节点文件
  • Debuger Daemon (debuggerd):启动Debugger系统
  • Android Debug Bridge Daemon (adbd):Android Debug Bridge连接管理
  • Radio Interface Layer Daemon (rild):无线通讯连接管理
  • Log Daemon (logd):日志管理
  • Health Daemon (healthd):系统健康管理,监听系统电量信息

      3. Context Manager

      Context Manager 是一个管理 Android 系统服务的重要进程。系统服务是组成 Android Framework 的重要组成部分,提供从相机、音频、视频处理到各种应用程序制作所需的重要 API。

      在系统启动时,Android 所有运行的服务都要把各自的信息注册到 Context Manager。应用程序或 Android Framework 内部模块在调用系统服务时,都需要先向 Context Manager 查询服务,然后再通过 Binder IPC(interprocess communication,应用间通信)调用相应的服务。

      4. Media Server

      Media Server 用于运行基于 C/C++ 的本地系统服务,如 Media Player Service、Resource Manager Service等。

      5. Zygote

      Zygote 进程用于缩短 Android 应用程序的加载时间。每当有 Android 程序需要执行时,Zygote 接收到请求后就会派生出一个子进程来执行应用程序。由于 Zygote 预先加载了应用程序所需的系统资源,派生出的子进程也共享这些资源,因而节省了系统资源重复加载的时间。

      6. System Server

      System Server 是由 Zygote 进程创建一个 Android 系统的核心进程。在 System Server 中可以看到它启动了 Android 系统中的大部分服务,如 Vr Manager Service(管理系统VR模式切换)、Display Manager Service(支持多种显示类型的多个显示器的镜像显示)等。

      为了将运行在 System Server 中的 Java 系统服务提供给 Android 应用程序或 Framework 内部模块调用,需要将这些服务先注册到 Context Manager中。

      在通过 Binder IPC 将 Java 系统服务注册到基于 C/C++ 的服务管理器时,需要使用 JNI(Java Native Interface)编程接口。

      7. Server

      Init 进程启动后将创建出以下本地服务:

  • Audio Server (audioserver):管理音频输入输出
  • Camera Server (cameraserver):管理相机功能
  • DRM Server (drmserver):DRM(Digital Rights Management)数字版权管理
  • Media DRM Server (mediadrmserver):多媒体数字版权管理

      由 Init 进程启动的以上服务也需要注册到服务管理器中才能被系统其它模块所使用,但区别于由 System Server 启动服务的注册方式,本地系统服务直接通过 Binder IPC 注册即可。

      以上就是对 Android 启动过程以及 Framework 初始化的简单介绍,当然这仅仅是 Android 启动过程的一部分。在所有 Java 系统服务加载完毕后,Activity Manager 会运行 Launcher 应用,继续启动过程。当 Launcher 应用启动完毕后,也就可以看到我们熟悉的 Android 系统桌面,此部分已经超出了本文的讨论范围,读者如有兴趣请参照 Android 源代码进行分析。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!