一. android系统启动过程
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的启动过程
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信息。