Android系统的启动过程以及APP的启动过程分析

Android App启动流程详解 前言:在之前的文章中已经写了apk的打包流程、安装流程,今天就是梳理一下apk系列的最后的流程--app启动流程。经过今天的梳理以后咱们就可以对apk包是怎么编译生成的、apk是怎么被安装到安卓手机的、用户点击了桌面icon以后app是怎么启动起来的 整个流程有清晰的认知和了解了。 下面先附上前面文章的传送门: apk打包流程详解 apk安装流程详解 在开始分析app启动流程之前,我们先回... 阅读详情

当我们们按下手机的开机按钮,眼睛看到的是绚丽的启动画面,然后是等待着一个我们可以点击的桌面出现。外行看热闹,内行看门道,我们是内行,从开机到显示桌面发生了什么?当点击桌面上的一个图标启动某个app,这里又发生了什么?本文将会按照如下安排来分析Android系统的启动过程以及APP的启动过程。同样,本文并不打算通过分析浩如烟海的源码,那样只会徒增篇幅,而对于Android应用开发工程师而言理解了本文也基本上满足要求了,笔者后续会出与本文对应的源码分析系列的文章,思想和细节相辅相成,帮助那些从事Framework层开发的读者朋友们,敬请期待。

  1. Android系统启动过程
    1. 理解Android系统启动过程有什么用
    2. Android系统启动中的7个步骤
  2. Android中APP的启动过程分析
    1. 应用程序进程启动过程
    2. 应用程序启动过程

Android系统启动过程

理解Android系统启动过程有什么用

Android的系统启动过程与APP的启动过程、四大组件原理、AMS(ActivityManagerService)、ClassLoader等有很强的关联,而所列举的这些又都是插件化开发以及热修复所必须掌握的基础,总之一句话,很重要!

Android系统启动中的7个步骤

其实这里说7个步骤是不准确的,因为Android系统启动过程太复杂了,这里说的7个步骤,本质上是系统启动过程中的7个重要结点。现在把7个步骤罗列如下:

1.启动电源

当按下电源按钮,芯片代码(已经由厂商提前固化在ROM中)从预定义的地方开始执行。加载引导程序BootLoader到RAM,然后执行。

2.执行引导程序BootLoader

引导程序BootLoader的主要作用是加载操作系统并开始运行。

3.启动Linux Kernel

Linux Kernel启动后,设置缓存、被保护存储器、计划列表、加载驱动。完成系统设置后在系统文件中寻找init.rc文件,随后启动init进程。

4.启动init进程

初始化并启动属性服务然后启动Zygote进程。

5.启动Zygote进程

创建Java虚拟机并为Java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer进程。

6.启动SystemServer进程

启动Binder线程池和SystemServiceManager,并启动各种系统服务

7.启动Launcher

被SystemServer进程启动的AMS会启动Launcher

如下图所示:

Android中APP的启动过程分析

应用程序进程的启动过程

在我们去理解“应用程序启动过程”之前,我们得先理解“应用程序进程的启动过程”。因为要想启动一个应用程序,首先得保证这个应用程序所需要的应用程序进程已经启动。ActivityManagerService在启动应用程序时会先检查这个应用程序需要的应用程序进程是否存在,如果不存在,AMS就向Zygote进程发起请求,通知Zygote启动需要的应用程序进程。通过什么方式请求呢?AMS和Zygote之间通过Socket进行通信,Zygote的Java框架层中创建过一个Server端的Socket,这个Socket用来等待AMS请求Zygote来创建新的应用程序进程。Zygote进程通过fock自身创建应用程序进程,这样应用程序进程就会获得Zygote进程在自身启动时候所创建的虚拟机实例。新创建的进程还会创建线程池和消息循环,这样运行运行在该进程中的应用程序才可以方便的利用Binder进行进程间通信以及进行消息处理。

应用程序的启动过程

当Android系统启动完成,我们眼睛看到的是桌面,这个桌面到底是个什么?其实,所谓的桌面,就是一个普通的app罢了,我们在桌面上点击一个图标启动一个程序,本质上,就是在一个应用程序中启动另外一个应用程序。然后,所有的应用程序都由AMS进行启动的,桌面程序无权直接启动一个新的程序的。这种情况下,我们会很自然的想到,桌面程序通知AMS启动一个具体的应用程序,AMS收到通知,然后执行启动对应应用程序的过程,值得一提的是,由于桌面程序和所有普通的应用程序一样,它和AMS之间处于不同的进程,因此需要利用某种机制实现跨进程通信,事实上是通过Binder机制进行跨进程通信,对于不了解Binder机制的读者朋友,请参阅笔者另外一篇文章《Android进程间通信(IPC)之Binder/AIDL》。下面我们来分析一个场景,来梳理出一个应用程序启动的大体过程。

场景:在Android手机桌面上,点击微信按钮

我们把启动微信分为7个步骤(6.0源码是这样实现的,不同版本,实现机制不完全一样)

  1. 桌面程序通知AMS,需要启动微信,而且指定要启动微信的首页
  2. AMS通知桌面程序,“情况我已经了解,你先休息一下”,同时AMS记录好需要启动的页面信息(这里就是首页)
  3. 桌面程序告知AMS,“好的我听你的,休息一会,你去忙着启动微信吧”
  4. AMS首先会检查微信是否已经启动过了。如果当前已经启动了,就唤起微信App即可。如果没启动,就需要启动一个新的进程,启动过程就如本文提到的那样。AMS会在新的进程中创建一个ActivityThread对象。并启动其中的main函数。
  5. 微信App启动成功后,通知AMS,“我启动好了”
  6. AMS找出在第2步记录的信息,通知微信,具体启动哪个页面(这里是首页)
  7. 微信应用程序启动首页,创建Context并于首页Activity进行关联。然后调用首页的Activity中的onCreate函数。

好了,Android系统的启动过程,以及APP的启动过程的大体思路就是这样了,本文中涉及到了不少的重要角色,笔者会在后续文章中逐一进行介绍,比如:

Instrumentation

ActivityThread

H

LoadedApk

AMS

ActivityManagerNative和ActivityManagerProxy

ApplicationThread和ApplicationThreadProxy

敬请读者朋友们期待。

交流QQ群:821357266

欢迎关注微信公众号:甲辞

 

 

Android APP应用启动过程分析_android系统fork一个进程到application创建中间做了什么 在Android中,所有应用都是一个独立的进程。每个应用进程都是由Zygote进程fork出来的。应用启动是一个跨进程的复杂工作,应用启动流程主要是围绕着SystemServer的ActivityManagerService和应用进程的ActivityThread展开的。APP应用的启动流程内容比较多,可以通过Launcher响应屏幕点击、APP进程的创建、Application初始化、UI布局和绘制这四部分来理解。 阅读详情

相关推荐

第二次启动android app的过程分析

网上关于在Launcher上第一次启动app的过程分析已经很多了,今天吃饭的时候在思考一个问题:我在Launcher上打开淘宝,切换到购物车,按Home 键回到Launcher,再次点开淘宝的时候仍然是购物车页面。按说Launcher每次点开app都是启动同一个activity(ACTION_MAIN , CATEGORY_LAUNCHER),那么这步转换是在哪里完成的呢? 回来翻了翻代码,找

飞久 3918

Android应用启动流程分析

这个消息显然也是抛到了应用进程的主线程去执行,所以ActivityThread.performLaunchActivity()函数会在主线程上执行,该函数从封装的数据结构ActivityClientRecord中取出Token对象,调用Activity.attach()函数,将其绑定到Activity上,如此一来,就建立应用进程的Activity与系统进程中ActivityRecord的关联。应用进程的Activity在创建的时候,就被赋予了一个Token,拿着这个Token才能完成后续与系统进程的通信。

2401_87255923的博客 2520

Android源码-Android系统启动源码分析

Android系统启动源码分析解读Android的源码可以让我们更好的学习系统的优秀源码,以及google工程师对于一个程序的是如何实现的,从源码的分析也可以强化我们的编程思想.引导Android系统启动流程源码分析,基于Android5.1(个人比较喜欢这个版本的源码,因为改动比较大)Android系统是基于linux内核的,所以在Android启动的时候会先去加载linux内核,内核启动的时候会

罗享的博客 2138

Android 系统的启动和App的启动流程

一、Android 系统的启动流程 在分析AMS之前,我们先看看Android系统的启动流程。       1.当用户按下电源开机键,引导芯片会加载BootLoader到内存中,开始拉起Linux OS,待Linux内核启动完毕后,它就会在系统文件中找init.rc文件,并启动init进程。       2.init进程在处理了一系列任务后,会进行一项非常关键的步骤:启动Zygote进程。

zzq2006的博客 1150

Android App启动流程

前言在使用Android手机时,我们总会启动各种各样的App以满足生活的各种需求,你是否想过,我们是怎样启动这些APP的?今天我将带着读者一起探索在Android系统中,一个App是如何被启动的。在开始分析之前,我们先回想下启动一个App的流程:Android系统桌面->点击应用图标->启动App从这个过程来看,只要弄明白: Android系统桌面是什么 点击应用图标后Android系统执行了什么操

追风筝的吃货,汪~ 3453

perfetto 分析camera启动性能

【代码】perfetto 分析camera启动性能。

hugang的博客 2107

Android系统启动流程

Android系统启动过程及APP的启动过程

Java和Android架构 7290

Activity启动流程分析(android-29),移动服务框架app下载安装

可以大概理解为所有与application有关的调用都会通过Instrumentation这样一个仪器来方便地观察到;换句话说就是,所有有关application的调用实际上都会通过Instrumentation;看一下其源码就可以看到它里面完成了许多功能: public class Instrumentation { private ActivityThread mThread = null; private MessageQueue mMessageQueue = null; private List

m0_64319298的博客 1207

Android---系统启动流程

1. init 根据 init.rc 运行 app_process,并携带“-zygote" 和"-startSystemServer"参数。2. AndroidRuntime.cpp::start() 里将启动 JavaVM,并且注册所有 framework 相关的系统 JNI 接口3. 第一次进入 Java 世界,运行 ZygoteInit.java::main() 函数初始化 Zygote,并创建 Socket 的 Server 端。

qq_44950283的博客 3294

Android系统应用层App启动过程分析

Android系统应用层App启动过程分析 Android启动App: 1、 先有Lancher启动ActivityThread,ActivityThread负责onPause、onStart等调度所有MainActivity; 2、 ActivityThread为App分配栈内存,使用:AndroidStack创建一个新的任务栈。由了栈内存后,就可以启动App了。 3、 Activi

HowieXue 薛永浩的博客 1309

Android 14.0 启动app时设置密码锁

在14.0的系统产品开发中,对于限制某些app的启动的功能中,在项目中的需求是在点击app启动的时候,根据包名设置密码锁,当输入正确的密码的时候来启动这个app,否则 就不能启动这个app,达到限制使用app的目的,这就需要在app启动的时候,检测app的包名,然后在app启动的时候弹出输入密码的窗口,让用户输入密码,当输入正确的密码 后,才可以使用app,这就需要先熟悉app的启动流程,然后来实现这个功能

安卓兼职framework和app工程师的博客 1632

Android APP应用启动过程分析_android系统fork一个进程到application创建中间做了什么(1)

当我们点击手机桌面上的应用图标,到手机桌面显示出应用主Activity界面而完成应用启动,看似很简单的过程其实包含了复杂的底层交互。整个启动过程,涉及了Android系统的很多核心知识点。首先,手机桌面就是一个APP应用,名称叫Launcher,是手机厂商提供的,不同的手机厂商开发出了一套自己UI风格的展示桌面。我们点击Launcher桌面的APP应用图标,可以打开其他的APP应用。APP应用的启动过程,分为冷启动和热启动两种。

2401_86391812的博客 1494

IoTDB时序数据库在Windows下的保姆级安装教程(含环境变量配置避坑指南)

本文提供Apache IoTDB时序数据库在Windows系统下的详细安装与配置指南。教程涵盖从Java环境检查、软件下载解压,到环境变量配置的深度避坑,并详解了服务的启动、停止、连接测试及基础数据操作,帮助物联网开发者在Windows平台快速搭建稳定的时序数据库环境。

weixin_29275257的博客 261

android系统_app冷启动流程分析

从上帝视角来看APP冷启动过程

博客 1543

医学图像可视化实战:ITK-SNAP与Python+SimpleITK双方案解析

本文深入解析了医学图像可视化的两大核心方案:ITK-SNAP与Python+SimpleITK。ITK-SNAP作为专业无损浏览器,是数据探索与分析的必备工具;而Python+SimpleITK方案则提供了自动化处理能力,但需注意将.nii.gz数据转换为JPG等格式时的信息损失。文章通过实战对比,为医学影像处理者提供了清晰的选择指南与避坑建议。

ol789012的博客 490

Ubuntu20.04安装NVIDIA显卡驱动避坑指南:从.run文件到完美运行

本文详细介绍了在Ubuntu20.04系统上通过.run文件安装NVIDIA显卡驱动的完整流程和避坑技巧。从禁用Nouveau驱动、选择合适显示管理器到处理常见安装问题,提供了一套经过验证的解决方案,帮助用户顺利完成驱动安装并优化性能。

weixin_30776273的博客 603

【Android】系统启动流程分析 —— Zygote 进程启动过程

本文基于 Android 14.0.0_r2 的系统启动流程分析。

Creativity + Efficiency = Success 4653

机场数据治理系列介绍(1):机场行业数据中台中的数据管理顶层设计方案

民航机场行业的数据中台中,有关数据管理顶层设计方案需要结合机场行业的业务特点和技术需求进行具体的设计,今日我们简要考量设计提供一个参考方案:

机场信息系统研究员的专栏 1604

Android4.4 Framework分析——Zygote进程的启动过程

Android启动过程中的第一个进程init,在启动过程中会启动两个关键的系统服务进程ServiceManager和Zygote。本文要介绍的就是Zygote进程的启动,Zygote俗称孵化器,专门用于生产(启动)新的进程。Zygote是在Init.rc(aosp/system/core/rootdir)里描述并由init进程启动的。相关代码如下:        service zygote

东哥日记 1482

Prism 入门02,区域介绍

什么是区域(Region)?区域,在Prism 框架中,区域是模块化的核心的功能之一,其主要作用是降低应用程序和模块之间的耦合度。使用方式:在应用程序的界面中,划分出某块区域,并为这个区域定义一个唯一的区域名称。那么通过这个区域名称,应用程序就可以找到指定的区域。并为这个区域动态放置一些容器或控件,从而呈现在界面中。

build2024 1126

C#上位机面试必问30题:机器视觉+工业通信+性能优化(含答案解析)

工业通信:围绕“稳定性”展开,重点答异常处理、断线重连、资源释放;机器视觉:围绕“精度+速度”展开,重点答预处理、ROI、参数优化;性能优化:围绕“UI不卡、内存不泄、效率不低”展开,重点答异步、限流、资源复用;面试加分项:结合实际项目案例(如“我在XX项目中用信号量解决了多设备并发卡顿问题”)。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1509

Android性能优化之APP 启动优化(不敢说秒开,但是最终优化完真不到 1s)

简介 性能优化的目的不是为了优化而优化,而且为了以后不再优化, 给自己统一 一个标准。 这里也许会有人问 APP 启动还需要优化吗?启动又不是我们自己写的代码,难道 Google 工程师会犯这么低级的错吗?其实这还真不是 Google 的错,应该说是给我们开发者留了一个坑吧。应该有的同学知道是怎么一回事儿了,当我们在系统桌面任意点击一个 APP 是不是会发现启动的时候有一瞬间有白屏出现(以前老...

weixin_43901866的博客 343

YOLOv8改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作

HorNet: 利用递归门控卷积实现高效高阶空间交互GnConv(Recursive Gated Convolution,递归门控卷积)

Limiiiing的博客 324
上一篇: Android进程间通信(IPC)之Binder/AIDL
杨艺韬
博客等级 码龄11年 2粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值