先对整体有了一个基本的认识之后,再去看细节

谈到Android Application的启动流程,很多文章都是各种源码类和方法的一堆调用关系,这样的文章就算看一百遍,也只是云里雾里。源码得看,但是最好不要一下子深陷到源码的细节之中,不可自拔。这里站在前人的基础之上做一个总结。

在说应用的启动流程之前,得先了解一下Android系统的启动流程,因为Application的启动是离不开系统的处理的。

Android系统的启动流程

  1. BootLoader启动内核和init进程;

  2. init进程分裂出过个守护进程,如Android Debug Damon,USB Damon,这些守护进程会处理一些与硬件相关的接口;

  3. init进程启动一个Zygote进程

    Zygote进程初始化了第一个VM,并预加载了Framework和一些通用资源。
    zygote进程会开启一个Socket接口,用来监听请求。一旦收到请求,Zygote会基于自身预先加载的VM来孵化一个新的VM,并创建一个新的进程。

  4. 启动Zygote之后,init进程会启动Runtime进程。Zygote会孵化出一个超级管理进程-System Server。System Server 会启动所有系统核心的服务,如Activity Manager Service以及硬件相关的Service。

5.这个时候就开始准备启动它的第一个App进程-Home进程了。

Android系统已经启动完毕,一些核心的服务也已经启动完毕,然后启动Launcher应用,那么什么时候启动应用的进程呢?

App进程什么时候被创建?

答案是被需要的时候才创建。
如果当一个应用(多是Launcher)调用App中的页面之时,如果目标进程不存在,则会创建一个新的进程并启动。

Application启动流程

在说Application启动流程之前,先看一张前人的流程图:
[外链图片转存失败(img-AEU66dOB-1566640969192)(

分析流程的时候,可以同时看一下上面的流程图。

  1. 点击桌面Icon
  2. 然后调用StartActivity(Intent intent)方法;
    这个方法最终会通过Binder IPC的方式调用ActivityManagerService,这里简称AMS。
  3. AMS会执行以下操作:
    1. 最终会通过PackageManager的resolveIntent()方法收集这个Intent对象的指向信息(中间会经历很多类,方法的调用)。
    2. 通过grantUriPermissionLocked()方法验证用户是否具有足够的权限去调用目标Activity;
    3. 查询ProcessRecord是否存在
      如果不存在,AMS会创建新的进程来实例化目标Activity。

接下来就说App进程的创建过程了。

App进程的创建

  1. 调用startProcessLocked()方法创建新的进程

    通过上面所说的Socket通道传递参数给Zygote进程,Zygote进程孵化自身,并调用ZygoteInit.main()方法来实例化ActivityThread对象,并最终返回新进程的pid。

  2. ActivityThread依次调用Looper.prepare()和Looper.loop()方法来开启消息循环。

这个时候进程已经创建完毕,但是如何与应用自身的Application联系起来呢?

Application的绑定

  1. 调用ActivityThread中的bindApplication()方法发送一个BIND_APPLICATION的消息到消息队列中.

  2. 通过handleApplication()方法处理之前的绑定消息;

  3. 调用makeApplication()方法来加载Application的class 到内存中。

大概的流程如下,如果需要做一些特殊的处理,还是需要自己深入到源码中,找到自己可以处理的点,进行一些定制化处理。

这篇文章基本上参考的Android Application Launch中的内容,有兴趣的可以去看原文。

Application启动流程相关推荐

  1. 文化袁探索专栏——Activity|Application启动流程

    文化袁探索专栏--Activity.Window和View三者间关系 文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--消息分发机 ...

  2. Apk应用安全加固所需了解的Application启动流程

    本文使用Android Q(API 29)版本源代码进行讲解 很多人认为Android应用加载入口是Application的onCreate,实则不然.当点击进入应用时,Zygote进程会fork出一 ...

  3. 一个APP从启动到主页面显示经历了哪些过程?(App启动流程,从点击桌面开始)

    本文以图文并茂的形式简单介绍一个APP从启动到主页面显示经历了哪些流程,以及实现的原理.不介绍具体源码,仅仅构建一个大体框架. 原地址链接:http://www.jianshu.com/p/a72c5 ...

  4. Application的启动流程

    总览 获取applicationThread,AMS这两个Binder attach时,将获取applicationThread对象也传递到AMS进程,请求远程调用通知AMS应用进程想要创建Appli ...

  5. Activity启动流程(六)注册目标Activity进程到system_server进程以及创建目标Activity进程Application

    注册Activity应用进程到system_server以及创建Activity应用进程Application Android四大组件源码实现详解系列博客目录: Android应用进程创建流程大揭秘 ...

  6. 源码分析-Activity的启动流程

    以android 6.0源码为参考,其他版本api会稍有不同 在Activity中,启动一个Activity的方法 @Override public void startActivity(Intent ...

  7. 【拒绝一问就懵】之Activity的启动流程

    背景介绍 从事开发到了一定阶段,想要提高就必须搞明白系统的一些工作原理.为什么?因为只有明白了这些,你才能针对平台的特性写出优质的代码.当遇到棘手的问题时,你才能更快速的结合系统原理去寻找最优解决方案 ...

  8. activiti自己定义流程之整合(五):启动流程时获取自己定义表单

    流程定义部署之后,自然就是流程定义列表了,但和前一节一样的是,这里也是和之前单独的activiti没什么差别.因此也不多说.我们先看看列表页面以及相应的代码,然后在一步步说明点击启动button时怎样 ...

  9. 深入理解Activity启动流程(三)–Activity启动的详细流程2

    本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--A ...

最新文章

  1. 华为正式发布鸿蒙2.0,更新人数太多挤爆服务器,P50也官宣了!
  2. enumerate在python中的意思_Python中enumerate用法详解
  3. linux bash输入输出重定向
  4. netscaler密码恢复
  5. setTimeout和setInterval实现定时器的区别
  6. SpringBoot+Shiro学习(八):RememberMe
  7. Springboot直接访问templates中的html
  8. 什么为java运行时的环境_什么是JRE?Java运行时环境简介(一)
  9. 分布式数据库clickhouse、tidb、palo对比
  10. fullgc触发条件_JVM的内存分配策略以及进入分代的条件
  11. Direct3D9 Fx/HLSL的若干条有用的笔记
  12. 大数据挑战与NoSQL数据库技术pdf
  13. 裴礼文《数学分析中的典型问题与方法》 P1~31
  14. Ubuntu傻瓜式录制GIF图—— Peek
  15. TB6612FNG电机驱动模块注意事项
  16. ROS运行管理之launch文件
  17. Wifi攻击工具 3:图形化工具 fern-wifi-cracker
  18. Hexagon GDB Debugger介绍(53)
  19. GetPixel算法
  20. Lenovo系列问题第四期

热门文章

  1. 2020我也当了面试官-java面试题之四
  2. python 执行shell_用Python调用Shell命令
  3. [HAOI2008]糖果传递
  4. Hbase、Kudu和ClickHouse横向对比
  5. IOS UTI(统一类型标识符) 根据文件后缀打开APP
  6. Uber收购动作引发巨震  美国外卖“三国杀”有望诞生“美团”?
  7. WireShark教程 – 黑客发现之旅(5) – (nmap)扫描探测
  8. CF446D. DZY Loves Games
  9. Git上修改分支名称
  10. Python 小型项目大全 36~40