Android系统中的启动回顾

211 阅读3分钟

一. android系统启动过程

image

1.上电

开机上电,加载固化的ROM,它负责加载引导程序到ram中执行

2. BootLoader

系统引导程序,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序.

3. linux系统内核

start_kernel启动Kernel,加载驱动,硬件,Linux_kernel启动完成后便会启动第一个用户空间的进程init

4. init (native守护进程,用户级)

  • linux内核会启动一个祖先进程init,它的入口函数位于system/core/init/main.cpp
  • 这是一个native进程,它在启动过程中会运行init.rc中的linux命令
  • init.rc中存放了要启动的其他进程
  • 它是一个守护进程,进程号为1,会守护如installd,rild,void等进程
  • 它通过import zygote4.rc,执行如下命令启动zygote进程。
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
  • app_process 会执行app_main.cpp的main方法,最终执行到ZygoteInit.java中的main方法
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);

5. zygote

  • native进程
  • 通过socket与其他进程通信
  • 它通过fork启动systemServer进程
  • ZygoteInit.preloadClasses加载系统资源,如class文件,so文件等 preload

6. systemServer

  • java进程
  • 负责启动其他服务如ams,pms,wms等,这些都不是单独进程
  • 启动binder线程池
  • 将ams,pms,wms注册到ServiceManager中

7.serviceManager

  • java进程
  • 通过binder机制与其他进程通信
  • 通过map维护其他其他服务的句柄

8.PackageManagerService

pms的作用是管理apk的解压,扫描与解析,卸载。

  • systemServer通过静态方法PackageMangerService.main启动pms,并注册到serviceManager中,注册的过程是进程间通信
  • android系统启动过程中,pm会扫描system/app,data/app目录下的apk,解压,遍历androidManifest.xml文件得到package,
  • 利用PackageParser解析得到四大组件信息,存放到packageName为key的HashMap中。其中Activity和Receiver使用的是同一个bean对象activity.
  • 当需要启动app中的某个页面时,ams会从pms中查询获得packageInfo启动。
  • app安装过程,将app拷贝到data/app目录下,创建应用的数据目录,PackageInstallerActivity会启动安装界面,最终调用pms.installPackageLI安装。

9. activityManagerService

负责系统中四大组件的启动、切换、调度及应用进程的管理等工作。

10. Launcher程序

activityManagerService加载完成后,会发送开机广播ACTION_BOOT_COMPLETED,之后就会开启系统的主程序——Launcher程序,完成系统界面的加载与显示。

二. app的启动过程

image

2.1 lancher应用

点击桌面图标,launcher进程中的Launcher桌面应用通过ActivityMangerProxy发送startActivity给systemServer进程中的ams

2.2 权限检查创建数据

  • ams通过resolveActivity(),借助PackageManager来查询系统中所有符合要求的Activity,当存在多个满足条件的Activity则会弹框让用户来选择。
  • 根据launchMode和Flag创建ActivityRecord,找到或者新建满足条件的task。

2.3 创建进程

  • 如果进程不存在则发送创建进程的消息给Zygote,否则直接进入app进程。
  • Zygote孵化app进程,启动ActivityThread,通过内部类ApplicationThread与ams通信,将ActivityThread与ams隔离。
  • ApplicationThread实际上是一个binder的stub对象

2.4 Activity生命周期

  • ams为每个activity创建Token来分别传递给ActivityThread和wms作为activity的唯一标志
  • ActivityThread执行handleLaunchActivity通过反射实例化Activity,并执行activity的生命周期函数。

三. apk的安装过程

3.1 点击apk

  • 点击apk,启动系统的InstallStart它是一个Activity,在onCreate中跳转到PackageInstallerActivity

二次确认弹窗

  • PackageInstallerActivity包含了继续安装和取消安装,点击继续安装跳转到InstallInstalling

确认安装

  • InstallInstalling(继承自AlertActivity),拷贝apk到data/app目录下
  • 执行pms的installStage执行安装。最终执行了PackageParse.parse方法解析apk包中的xml获取package信息。