摘抄自<<Android 进阶解密>>一书
Android 系统启动流程:
BootLaoderLinux内核启动init进程启动:主要是用来初始化和启动属性服务,也用来启动Zygote进程僵尸进程:在Linux中,父进程使用fork创建子进程,子进程终止后,但父进程不知道子进程终止,虽然子进程已经退出,但系统还未它保留一定的信息(比如进程号,退出状态,运行时间),这时候,子进程就被称为僵尸进程。系统资源有限,如果进程被僵尸进程耗尽,那么就无法创建出新的进程。
Android 提供一种属性服务相当于Windows下的注册表管理器记录用户及软件信息,即使系统或软件重启,根据之前的信息,进行一些初始化操作。
在Linux新内核中:epoll用来替换select,它是Linux为处理大量文件而做的改进的poll,是Linux多路复用I/O接口select/poll的增强版。它能够显著的提高程序在大量并发连接中只有少量活跃情况下的系统CPU利用率。epoll内部用于保存事件的数据类型是红黑树,查找速度快,只有O(logn),select采用数组保存信息查找速度慢只有O(n),只有当少量文件描述符值,epoll与select的效率才会差不多。
系统属性分为两种类型:一种普通属性,一种控制属性,控制属性用来执行一些命令,比如开机动画。
init进程总结:
init.rc配置文件并启动Zygote进程在Android系统中,DVM(Dalvik虚拟机)与ART、应用程序进程以及运行系统关键服务的SystemService进程都是有Zygote进程创建的。它通过fork(复制进程)的形式创建应用程序的进程与systemservice进程。zygote启动时会创建DVM与ART。
Android 5.0开始,支持64位程序,因此zygote也就有了32位与64位区别
Zygote进程都是通过fork创建子进程.
在app_main的函数中调用了AndroidRuntime的start方法。start方法进行启动java虚拟机,为java虚拟机注册JNI方法,而Zygoteinit的main方法由java语言编写,当前运行逻辑在Native中,这就需要JNI调用java。这样Zygote就进入了java框架层。
ZygoteInitmain方法:
Server端的SocketSystemServer进程AMS请求创建新的应用程序进程Zygote进程启动总结:
Appruntime并调用start方法,启动Zygote进程java虚拟机并为java虚拟机注册JNI方法JNI调用ZygoteInit的main函数进入Zygote的java框架层registerZygoteSocket方法创建服务器端的socket,并通过runSelectLoop方法等待AMS请求来创建新的应用程序进程systemserver进程主要用于创建系统服务,比如AMS、PMS与WM都是它创建
SystemServer的main方法只调用了SystemServer的run方法
该方法主要做了:
Looperliandroid_servers.socontextAMS、PowerManagerService与PackageManagerService等服务DropBoxManagerService、BatteryService等Cam而ManagerService、AlarmManagerService、WindowManagerService等ServiceManager用来管理系统各种Service,用于系统C/S架构中的Binder通信机制;Client端要使用某个Service,需要先到servicemanager查询service相关信息,然后根据相关信息所在的service进程建立通信。
SystemServer总结:
Binder线程池,这样就可以与其他进程通信SystemServiceManager,其用于对系统的服务进行创建,启动与生命周期管理系统最后一步是启动一个应用程序来显示系统中已经安装的应用程序,这个应用程序叫做Lanuncher。它会启动过程中请求PackageManagerService返回系统中已经安装的应用程序信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序。
通俗来讲Lanuncher就是Android系统桌面
android系统的启动器,用于启动应用程序Android系统的桌面,用于显示和管理应用程序快捷图标或者其他桌面组件启动的应用程序就是Lanuncher,因为Lanuncher的Androidmanifest文件中的intent-filter标签匹配了Action为Intent.ACTION_MAIN,Category为Intent.CATEGORY_HOME,设置了这样的属性,activity就成为主activity
Launcher显示应用程序图标,它是用工作区的形式显示系统安装应用程序的快捷图标,每一个工作区用来描述一个抽象的桌面,由n个屏幕组成,每个屏幕又分n个单元格每个单元格用来显示一个应用程序快捷图标
当电源按下时引导芯片代码从预订的地方开始执行。加载引导程序BootLoader到RAM,然后执行
BootLoader它是在android操作系统开始运行前的一个小程序,它的主要作用把系统OS拉起来并运行
Linux内核启动当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找init.rc文件,并启动init进程
初始化和启动属性服务,并且启动Zygote进程
Zygote进程启动创建Java虚拟机并为java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer服务
SystemServer进程启动启动Binder线程池和SystemServiceManager,并且启动系统各种服务
Launcher进程启动被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已经安装的应用快捷图标显示在桌面上