Android系统启动

平常我们使用手机的是不是一直在点击一个个的App图标,然后由系统帮我们打开App去使用。看起来很简单,其实系统底层帮我们做了很多事情。现在我们从App应用开发的角度带着问题去了解底层的部分实现。

  1. android系统是怎么启动的
  2. 怎么看到的系统桌面

android系统是怎么启动的
当Android手机通电启动后,会有一个类似计算机系统的引导程序BootLoader,用于初始化硬件设备,建内存空间的镜像图,为最终调用系统内核准备好环境,内核环境准备好后会初始化各种软硬件环境,加载驱动程序,挂载根文件系统,Linux内核加载的最后阶段会启动执行第一个用户进程init进程,当init启动后,就代表系统已经顺利的启动了Linux内核。

init进程的启动位于init.rc文件,由default.prop文件加载后解析。在linux系统中,所有的进程都是init进程的子孙进程,所有的进程都是直接的或间接的由init进程fork出来的.在init进程启动的过程中会启动以下几个重要服务

  • -zygote:进程孵化器,启动Android Java VMRuntime 和启动systemserver,负责Android应用进程的孵化工作
    *-servive_emanager:启动binder IPC,管理所有的Android 系统服务,包括ActivityManager,PowerManager等
  • -sruface_flinger:启动SurfaceFlinger负责显示输出
  • -media_server:启动AudioFlinger,MediaPlayerService和CameraSercice,负责多媒体播放相关功能,包括音视频解码
    *-mountd:启动安装Daemon,负责设备安装及状态通知
    *-debuggerd:启动debug system,处理调试进程的请求
    *-rild:启动radio interface layer daemon 服务,处理电话相关的事件和请求

下面是一张init 启动的整个流程图,这里可以看到当Zygote进程启动完后,就可以看到应用桌面了,这也是很关键的一步,下面具体分析
在这里插入图片描述

Zygote启动流程
当Zygote进程启动后,会执行frameworks/base/cmds/app_process/App_mian.cpp文件的main()方法,创建一个AppRuntime变量,然后调用它的start成员函数
runtime.start("com.android.internal.os.ZygoteInit", startSystemServer)

由于AppRuntime继承AndroidRuntime,并且自己没有start()方法,故调用的是AndroidRuntime的start()方法,方法里主要做了3件事

  1. 调用函数startVm启动虚拟机
  2. 调用函数startReg注册JNI方法
  3. 调用com.android.internal.os.ZygoteInit类的main函数

ZygoteInit.main函数定义在
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中,主要也做了3件事

  1. 调用registerZygoteSocket函数创建了一个socket接口,用来和ActivityManagerService通讯
  2. 调用startSystemServer函数来启动SystemServer组件
  3. 调用runSelectLoopMode函数进入一个无限循环在前面创建的socket接口上等待ActivityManagerService请求创建新的应用程序进程

当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程

ZygoteInit.startSystemServer这个函数定义在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中:
一路调用到RuntimeInit.zygoteInit()方法,这个方法会执行两个操作

  1. 一个是调用zygoteInitNative函数来执行一个Binder进程间通信机制的初始化工作,这个工作完成之后,这个进程中的Binder对象就可以方便地进行进程间通信了
  2. 调用传进来的com.android.server.SystemServer类的main函数,

SystemServer.main这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:
SystemServer.main方法会执行JNI方法init1,然后init1会调用这里的init2函数,在init2函数里面,会创建一个ServerThread线程对象来执行run方法初始化一些系统关键ManagerService的启动操作,如PackageManagerService和ActivityManagerService

在这里详细介绍下SystenServer的run方法中所初始化的ManagerService

  • PowerManagerService电源管理服务
  • ActivityManagerService管理Activity
  • PowerManagerService程序包管理服务
  • BatteryService电池管理服务
  • LightService自然光强度感应传感器服务
  • VibratorService震动传感器服务
  • ClipboardService剪切板服务
  • NetworkManagerService网络管理服务
  • InputMethodManagerService输入法管理服务
  • BluetoothService蓝牙服务

ServerThread执行流程
在ServerThread的run方法中执行如下代码得到一个PowerManagerService

pm = PackageManagerService.main(context,
factoryTest != SystemServer.FACTORY_TEST_OFF);

PackageManagerService.main 这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中,这个函数创建了一个PackageManagerService服务实例,然后把这个服务添加到ServiceManager中去ServiceManager是Android系统Binder进程间通信机制的守护进程,负责管理系统中的Binder对象

public  static final IPackageManager main(Context context, boolean factoryTest) {
PackageManagerService m = new PackageManagerService(context, factoryTest);
ServiceManager.addService("package", m);return m;}

在创建这个PackageManagerService服务实例时,会在PackageManagerService类的构造函数中开始执行安装应用程序的过程,安装的过程就是把应用的package、provider、service、receiver和activity等信息保存在PackageManagerService服务中,然后再使用Home应用程序,从PackageManagerService服务中把这些安装好的应用程序取出来,并以友好的方式在桌面上展现出来,在Android系统中,负责把系统中已经安装的应用程序在桌面中展现出来的Home应用程序就是Launcher

这里我们再说一下SystemServer.main()方法,Android系统的Home应用程序Launcher是由ActivityManagerService启动的,而ActivityManagerServicePackageManagerService一样,都是在开机时由SystemServer组件启动的. SystemServer组件首先是启动ePackageManagerServic,由它来负责安装系统的应用程序,系统中的应用程序安装好了以后,SystemServer接下来就会通过ActivityManagerService来启动Home应用程序Launcher了. Launcher在启动的时候就会通过PackageManagerService把安装好的应用以快捷图标的方式展现出来。

bootloadre引导与linux启动
https://www.jianshu.com/p/9f978d57c683

Linux的init进程创建一个 Zygote进程
https://blog.csdn.net/Luoshengyang/article/details/6768304

Zygote启动去安装手机默认的应用程序
https://blog.csdn.net/luoshengyang/article/details/6766010

默认的Home应用Launcaer的启动过程
https://blog.csdn.net/Luoshengyang/article/details/6767736

点击应用程序启动app
https://blog.csdn.net/luoshengyang/article/details/6689748

http://gityuan.com/page10/

https://blog.csdn.net/freekiteyu/article/details/79175010
https://www.cnblogs.com/Jax/p/6864103.html
https://www.jianshu.com/p/a72c5ccbd150
https://www.jianshu.com/p/6037f6fda285
https://www.jianshu.com/p/a72c5ccbd150
https://www.jianshu.com/p/5cf360fc9957

https://www.jianshu.com/p/37e5a8e45d6b
https://blog.csdn.net/callactivityoncreate/article/details/50418500

http://liuwangshu.cn/framework/pms/1-packageinstaller-initialize.html
http://liuwangshu.cn/application/plug-in/1.activity.html

https://blog.csdn.net/lu1024188315/article/details/75722420

猜你喜欢

转载自blog.csdn.net/oheg2010/article/details/82826219