0. 前言  

从Android手机打开开关,到我们可以使用其中的app时,这个启动过程到底是怎么样的?

1.  系统上电

当给Android系统上电,在电源接通的瞬间,CPU内的寄存器和各引脚均会被置为初始状态,CPU复位之后,程序指针会指向启动地址,从该地址读取并直接运行启动程序的可执行代码,或者将可执行代码与数据载入CPU内置的RAM中再运行。这一段代码,放在PC中,叫做BIOS,而在Android等嵌入式系统中就叫做Bootloader。

2.  Bootloader引导程序

通过Bootloader引导程序,可以初始化硬件设备,建立内存空间映射图,为操作系统内核准备好环境,完成整个系统的加载启动任务。

 Bootloader是支持交互式操作的,一般刷机中会用到的Fastboot模式,就是在Bootloader启动之后,根据用户输入的指令(在手机上用音量键,Home健等操作),停留在当前状态。

而正常情况下,Bootloader程序执行完成之后,就会开始加载Android操作系统。

3.  加载内核

我们知道Android操作系统的内核其实就是Linux内核。当Bootlader引导程序启动之后,就会进入Linux的内核引导阶段。该阶段会初始化内核和设备驱动,接着启动内核,挂载文件系统,最后启动用户空间进程。

4.  Init程序

Init程序是用户空间的第一个进程。它负责解析一个叫做init.rc的配置文件,启动Android系统底层运行的一些服务进程。

init.rc文件定义了不同的Action和Service,其格式如下:

//Action是以关键字on来定义的,紧接着的boot是一个触发条件
//如下面的action表明当Android启动(boot)的时候,要做些什么事情
// Action boot之后的class_start core等,是Init程序在开机时会启动的服务
//这些服务包括ueventd, servicemanager, void, zygote,installd, ril-daemon等,我们一般称它们为守护进程
on boot ... class_start core class_start main //Service是以关键字servie来定义的,紧跟着的是其名字和其启动的文件
//如下会执行/system/bin/serviemanager文件,并将其命名为servicemanager
service servicemanager/system/bin/servicemanager #声明一个service,而servicemanager则是其名字 class core                         #optioin, 该service属于core类 usersystem                         $option,该service属于System用户 group System 

Init程序同时也会开启属性服务,存放一些关于Android系统的全局系统设置信息。

最后,当所有的Action和Service都启动完成之后,Init程序就会进入一个无限的循环,监听系统中发生的事件,对一些事件进行处理,比如重启某些服务等。

5.  ServiceManager

ServiceManager是Init程序启动的守护进程之一,它是Android中Binder通信机制的基础。

ServiceManager提供了注册,检索服务的功能。在Zygote子进程system_server启动的每一项服务都会将其注册到ServiceManager中,由ServiceManager来统一进行管理。值得注意的是,ServiceManager本身也是一个Service,所以它也会将自己注册到自身上面。

而ServiceManager启动的过程做了三件事:

(1)打开Binder设备,把Binder设备映射到内核空间中,由于内核空间是所有进程共享的区域,所以借助这块区域,可以实现不同进程间资源的共享,从而达到进程间通信。

(2)ServiceManager本身会变成一个ContextManager,即上面所说的注册到自己身上,负责各种Service的上下文管理。

(3)最终ServiceManager也是会进入一个无限循环。

6.  Zygote

Zygote也是由Init程序启动的其中一个服务,是Android中的第一个Dalvik虚拟机。在之后,所有的Dalvik虚拟机都是由Zygote孵化出来的,这是因为Android中每一个应用都有着自己的进程,而每一个进程中都着一个Dalvik虚拟机,如果每起一个应用就创建一个虚拟机,效率太低,而通过复制Zygote,不仅可以提高创建的速度,还能够共享系统和框架的资源,可以大幅度提高应用程序启动的效率。

Zygote启动之后:

(1)首先会创建一个socket,等待某个客户端的请求。

(2)接着创建其第一个子进程system_server。system_server会开启Android系统的Native Service和Java Service。

其中Native Service就是那些利用JNI实现的共享库,而Java Service则是通过Java语言实现的ActivityManagerService等,都是在这个阶段由system_server启动并注册到一个叫ServiceManager的服务进程中。

ActivityManagerService启动之后,会进入到一个叫System Ready的状态,而在其达到System Ready的状态之前呢,就会启动一个叫做Launcher的应用,而这个Launcher就是Android系统启动成功之后见到的Home桌面了。

而在SystemReady的状态,其会跟Zygote启动之初的Socket进行通信,告诉Zygote一切已经就绪。

(3)Zygote知道已经启动成功,就开始进入一个无限的循环,在Socket上等待请求的到来。

至此,从Android手机上电的那一刻起,到加载内核,到最后显示Home桌面的整个过程就结束了。


7.  APK的安装过程

Android系统启动的过程中会启动一个应用程序管理服务PackageManagerService(系统启动的时候由SystemServer组件启动),这个服务负责扫描/system/framework、/system/app、/vendor/app、/data/app、/data/app-private五个目录下的APK文件,然后解析该APK中的AndroidManifest.xml以获得应用程序相关信息,其中最重要的就是依据sharedUserId这个配置来让系统确定每个APK运行在哪个进程。
继而为这个APK分配Linux用户ID、用户组ID以便APK在系统中可以获取到合适的运行权限、资源访问权限。
最后将之前获得的权限和APK安装信息保存到本地的一个配置文件中,以便下次在安装这些APK时可以将需要的APK信息很快速的恢复回来。

8.  应用启动流程

8.1  应用的冷热启动

Android中的冷启动指当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

Android中的热启动指当启动应用时,后台已有该应用的进程(如按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),热启动就不会走Application这步了。

 

8.2  应用的启动流程

当点击app图标时,系统会从Zygote进程中fork创建出一个新的进程分配给该应用,之后会依次创建和初始化Application类、创建MainActivity类、加载主题样式Theme给MainActivity以及配置Activity层级上的一些属性、再inflate布局、当onCreate/onStart/onResume方法都走完了后最后才进行contentView的measure/layout/draw显示在界面上,所以直到这里,应用的第一次启动才算完成,这时候我们看到的界面也就是所说的第一帧。

总结一下,应用的启动流程如下:

Application的构造器方法——>attachBaseContext()——>onCreate()——>Activity的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上


8.3  启动时间优化

可以通过adb shell命令的方式进行测量应用的启动时间:

adb shell am start -W [packageName]/[packageName.MainActivity]

应用初始化的时候采取以下策略可减少启动时间:

(1)在Application的构造器方法、attachBaseContext()、onCreate()方法中不要进行耗时操作的初始化。

(2)对于MainActivity,由于在获取到第一帧前,需要对contentView进行测量布局绘制操作,尽量减少布局的层次,考虑StubView的延迟加载策略,当然在onCreate、onStart、onResume方法中也要避免做耗时操作。


感谢:

http://blog.csdn.net/linmiansheng/article/details/37728903

http://blog.csdn.net/u010687392/article/details/50518343

http://www.2cto.com/kf/201607/528367.html

http://www.jianshu.com/p/0b0d6f684580

转载于:https://www.cnblogs.com/qitian1/p/6461494.html

Android开发——Android系统启动以及APK安装、启动过程相关推荐

  1. p750tm安装linux系统,Android 开发环境(虚拟机,LINUX, secureCRT)安装过程.pdf

    Android 开发环境(虚拟机,LINUX, secureCRT)安装过程 Android linux 开发环境(虚拟机,LINUX, secureCRT )安装过程 注意 由于selinux 打开 ...

  2. android 判断安装微信,Android开发中判断手机是否安装了QQ或者微信

    下面一段代码给大家分享了android中判断手机是否安装了qq或者微信,代码简单易懂,非常不错,具有参考借鉴价值,需要的的朋友参考下吧 public static boolean isWeixinAv ...

  3. 从源码角度看Android系统Launcher在开机时的启动过程

    Launcher是Android所有应用的入口,用来显示系统中已经安装的应用程序图标. Launcher本身也是一个App,一个提供桌面显示的App,但它与普通App有如下不同: Launcher是所 ...

  4. Android开发——Android手机屏幕适配方案总结

    0. 前言 Android的屏幕适配,即使得某一元素在Android不同尺寸.不同分辨率的手机上具备相同的显示效果,这个问题一直以来都是我们Android开发者不得不面对的问题.本文参考了很多前人的博 ...

  5. Android开发-Android studio自带模拟器使用中文拼音输入法

    Android开发-Android studio自带模拟器使用中文拼音输入法 搜狗输入法下载 搜狗输入法安装 修改模拟器语言 搜狗输入法下载 上篇文章中我们在Android studio中创建了X86 ...

  6. linux文件系统启动流程,linux 内核启动过程以及挂载android 根文件系统的过程

    转载 作者:汕头大学-黄珠唐 时间:2009 年10 月29 日 主要介绍linux 内核启动过程以及挂载android 根文件系统的过程,以及介绍android 源代码中文件系统部分的浅析. 主要源 ...

  7. android开发入门配置,Android开发入门——Andoird Studio的安装与配置

    Android的开发离不开Java,仍然需要对Java进行安装与配置,所以我写了上一篇文章,Java的安装与配置. 开始进行Android Studio的安装与配置. 一.进行配置Java,如果电脑里 ...

  8. Android 安装apk流程,Android PMS(二)-Apk安装流程

    原创内容,转载请注明出处,多谢配合. 一.APK组成 在APK的安装流程,在此之前先简单了解下APK组成: 目录/文件 描述 assert 存放的原生资源文件,通过AssetManager类访问. l ...

  9. android编译apk报错,android studio 编译出的apk安装报错 “应用是非正式发布版本,...

    Android开发--自定义控件 Android开发--自定义控件 一.创建一个XML布局文件用于存放自定义控件的布局 layout_item.xml ?xml version=1.0 encodin ...

最新文章

  1. apply call bind 简介
  2. phpcms v9 实现外部栏目链接在新窗口打开
  3. srs 配置http flv集群
  4. Java:Java的输入类Scanner
  5. vs设计窗口不见了_VS厂欧米茄海马300系列女王密使腕表评测
  6. cocos2d中CCSprite的使用总结 【转】
  7. 8.10 数据库安全性II Day28
  8. vs2017环境下编译log4cpp-1.1.3
  9. 一步一步搭建11gR2 rac+dg之配置单实例的DG(八)
  10. zkdemo可以直接调用html,中控指纹机ZKBIOOnline BS开发包 含示例DEMO
  11. 线性插值_c语言实现
  12. 当心Excel中的嵌套IF公式
  13. 编程之美--数组中的最长递增子序列(LIS longest increasement sequence)
  14. 在VB.NET中生成随机数
  15. 【徕卡全站仪Geocom开发】开发日志#01
  16. 双11中奖名单公布啦
  17. autocad2014 第二次打开闪退_解决win10下autocad2014闪退的修复方法
  18. LINUX下设置postgresql的登录密码
  19. PL/SQL存储过程
  20. 王道考研操作系统个人笔记--第一章计算机系统概述

热门文章

  1. predicate 列存储索引扫描_ColumnStore index (列存储索引)解析
  2. 【安卓开发 】Android初级开发(九)Android中封装View提供接口供点击事件回调的方法及使用
  3. linux 命令 ppt,Linux基本命令()讲解.ppt
  4. android 打印机蜂鸣器,CANON喷墨打印机 蜂鸣器响5声不打印的问题解决办法
  5. c语言osversioninfoex,xi52qian
  6. 光猫的分类及应用范围有哪些?
  7. 工业级POE交换机技术优势及供电方法详解!
  8. 【渝粤教育】国家开放大学2018年秋季 0690-21T化工原理及实验 参考试题
  9. 【渝粤教育】国家开放大学2018年秋季 0699-22T阅读与写作 参考试题
  10. 【渝粤教育】国家开放大学2018年春季 0105-21T酒店营销实务 参考试题