Android 应用启动流程初步分析之1

Android 应用启动流程初步分析之1

为什么要写文章?

认识自己的不足,并加强对Android系统的认识,提高自己的表达能力。

准备

本文以启动时钟应用为例:

  1. 基于Android 4.4源码

  2. 涉及的进程 Launcher进程, system_server进程, zygote进程, dalvik进程(时钟应用进程)

  3. 进程之间通信机制:基于Binder实现的IPC机制

从不同的角度来看,应用的启动是不同

从手机用户的角度来看,当点击Launcher应用上的应用图标,应用就已经被启动了。

从开发者的角度来看,调用startActivity/startActivityForResult方法时(浅显的来看),就会启动应用。

初步了解Android系统的启动流程

Android 应用启动流程初步分析之1_第1张图片

  1. 按上电源键后,首先会CPU会执行固化在ROM(只读存储器)上的启动引导代码,将BootLoader代码加载到内存。(“芯片厂商”负责设计和实现)

  2. Bootloader开始执行,首先会完成硬件的初始化,然后找到Linux内核代码,并加载到内存。(“设备厂商”负责设计和实现)

  3. Linux内核开始启动,初始化各种软硬件环境,加载驱动程序,挂在根文件系统,并执行init程序,就是启动第一个系统进程init进程(Android内核开发需要涉及,注意执行完这一步,我们可以在屏幕上看到Android的LOGO)

  4. init进程启动过程中,会创建一些系统目录,设置权限,比如/dev,/proc,/sys等等;并且会解析并执行init.rc文件,启动一系列服务和进程。

    init进程执行init.rc文件时,创建了两种服务:

    • 本地服务:指运行在C++层的系统守护进程。一部分有init进程直接启动(定义在init.rc上),还有一部分是由本地服务创建,比如CameraService;init.rc文件所在位置: system/core/rootdir/

    • Android服务:指运行在Dalvik虚拟机进程中的服务。init进程执行app_process程序,创建Zygote进程(Android系统中最重要的进程,Android应用程序的进程都是通过Zygote进程fork出来的);Zygote进程首先会fork出“SystemServer”进程,而SystemServer进程会创建所有Android核心服务,

    Zygote进程源码:frameworks/base/cmds/app_process/app_main.cpp

    比如常见的AndroidManagerService(AMS),PackageManagerService(PMS)等等。

    当所有服务器启动完毕,SystemServer会打印出“Making services ready”,然后通过ActivityManager启动Home界面。

    注意这时候手机进入Launcher界面了。

通过上面基本分析,可以将Android系统启动分为3部分,Android系统底层,Linux内核层,Android应用层。

  • Android系统底层:最底层的,由芯片厂商负责的。

  • Linux内存层:由设备厂商负责的,比如小米,华为等等,做内核开发需要理解

  • Android应用层:Android开发的需要理解,这个过程从Zygote进程开始。

启动大概流程

Android 应用启动流程初步分析之1_第2张图片

  1. 点击应用图标,Launcher进程会通知AMS启动应用

  2. AMS(运行在system_server进程上)接收到创建通知,会判断下应用是否启动,未启动则会通知Zygote进程孵化应用进程

  3. Zygote创建应用进程(DVM进程),并执行ActivityThread的main方法(即应用的主线程)

  4. 应用进程会将自己绑定到AMS中

  5. AMS启动应用的main Activity

参考:

【Android 系统开发】 Android 系统启动流程简介
Android内核开发:图解Android系统的启动过程
深入理解Activity启动流程(一)–Activity启动的概要流程
Android 应用程序启动过程分析
框架层理解Activity生命周期(APP启动过程)

你可能感兴趣的:(android,应用启动流程分析)