App的启动流程详解

上篇,我们聊完了APP的"生老病死",接下来我们来聊聊在各自的系统中,App是如何启动的。

从电脑的windos 95的操作系统开始,我们启动电脑或者手机以后,我们看到的第一个界面就是系统的桌面(iOS叫 springboard ,Android叫Launcher )如下图所示:

一、APP的启动流程介绍

1、Android启动流程介绍

用户通过点击桌面Launcher上的图标就可以触发app的启动了。 Android的App的启动流程其实可以整体分为两部分,一部分是点击Launcher上的app图标,Launcher通过AMS向Zygote请求孵化应用进程,随后ActivityThread的main方法就启动了。第二部分是ActivityThread(App的进程)启动之后,App进程通过AMS创建Application和Activity,最后执行Activity的生命周期。

简要概括的话就是两个流程:

1)Launcher -> AMS -> Zygote -> ActivityThead

2)ActivityThread -> AMS -> (Application/Activity

上面的两个流程可以大体总结为几个阶段:
1)桌面Launcher进程请求AMS。
2) AMS请求Zygote创建应用进程。
3) Zygote孵化进程后执行ActivityThread的main方法。
4)ActivityThread请求AMS。
5)AMS发送创建Application请求。
6)AMS发送创建Activity请求。

整个流程看起来比较复杂,实际流程比这个还要更复杂,但是对我们关注应用开发者来说只需要关注最后两个流程就可以了。

简单概括为,用户点击APP图标后,App开始启动,然后会调用我们创建的Applicationd对象初始化APP,然后会创建第一个主Activity显示我们的程序界面

2、iOS的启动流程介绍

同样,在iOS上,用户通过点击桌面SpringBoard上的图标就可以触发app的启动了。 Android的App的启动流程其实可以整体分为两个阶段,pre-main阶段和main()阶段。程序启动到main函数执行前是pre-main阶段;在执行main函数后,调用AppDelegate中的-application:didFinishLaunchingWithOptions:方法完成初始化,并展示首页,这是main()阶段,或者叫做main()之后阶段。

(1)pre-main阶段:
  • **加载应用的可执行文件 **。 (通过调用exec函数)
  • 加载动态链接库加载器dyld(dynamic loader)。
  • dyld递归加载应用所有依赖的dylib(dynamic library 动态链接库)。
  • 进行**rebase指针调整和 bind**符号绑定。
  • ObjCruntime初始化 (ObjC setup):ObjC相关Class的注册、category注册、selector唯一性检查等。
  • 初始化(Initializers) :执行+load()方法、用attribute((constructor))修饰的函数的调用、创建C++静态全局变量等。
(2)main()阶段:
  1. dyld调用main()
  2. 调用UIApplicationMain()
  3. 调用applicationWillFinishLaunching
  4. 调用didFinishLaunchingWithOptions

同样,我们也不用关注上面的复杂启动流程,只需要知道main()阶段的几个方法即可,下面我们将通过两个程序来帮助大家加深了解Android和iOS的App启动流程

二、Android中APP启动Demo

1、下载Android Studio

下载地址:developer.android.google.cn/studio?hl=z...

2、安装Android Studio

一路点击Next,是用默认配置即可,最后点击Finish安装成功

3、创建Demo程序

  1. 点击画线button创建App
  1. 创建Empty Activity,点击 Next
  1. 使用截图配置,点击Finish创建App
  1. 点击画线区域切换为Project模式
  2. 鼠标右键点击画线出,选择 New -> Kotlin Class/File,输入类名'CostomApplication'
  3. 在文件中,写入如下代码
kotlin 复制代码
override fun onCreate() {  
super.onCreate()  
Log.e("lanching", "Application = onCreate:++ ", )  
}
  1. 在'AndroidManifest.xml',添加画线配置
  1. 在MainActivity中,添加日志输出的代码
  1. 如果没有模拟器,可以点击第一个红线,然后点击第二个红线创建设备
  1. 点击运行,可以看到APP确实先创建了Application,然后创建在MainActivity

总结:通过上面的Android启动Demo,我们从代码成面上验证了APP启动会先创建Application,然后创建在MainActivity,我们可以根据具体的需求,在每个流程添加具体的功能代码。上面我们将的其他流程,是操作系统行为,我们只需要了解即可。

三、iOS中APP启动Demo

1、安装xcode

2、创建Demo程序

  1. 点击 Create New Proect,创建项目
  1. 选择创建iOS的App
  1. 输入项目名称,点击Next,然后选择项目目录,点击Create
  1. 在创建的项目中,main文件里面添加日志代码
  1. 在AppDelegate文件里面添加日志代码
  1. 在ViewController文件里面添加日志代码

7.点击画线区域选择模拟器,点击运行,就可以看到流程日志打印

总结:通过上面的iOS启动Demo,我们从代码成面上验证了iOS的APP启动会先执行main函数创建UIApplication实列,然后执行Appdelegate的didFinishLaunchingWithOptions方法,最后加载首页的ViewController

四、整体总结

通过上面的介绍,我想大家对Android和iOS中App的启动流程有了一定的了解,在App开发过程中,上面的流程已经能过覆盖我们绝大多数的需求,但是如果感兴趣想深入了解App的启动流程,可以查阅相关知识继续深入

相关推荐
Lazy_zheng3 分钟前
从 DOM 监听到 Canvas 绘制:一套完整的水印实现方案
前端·javascript·面试
尘寰ya5 分钟前
前端面试-微前端
前端·面试·职场和发展
蘑菇头爱平底锅6 分钟前
数字孪生-DTS-孪创城市-前端实现动态地铁分布线路图
前端·javascript·数据可视化
祯民10 分钟前
AI 时代前端进阶:10分钟入门基于 HuggingFace Transformers 库开源模型私有化部署
前端·aigc
驱动小百科26 分钟前
chrome无法访问此网站怎么回事 分享5种解决方法
前端·chrome·谷歌浏览器·谷歌浏览器无法访问此网站·无法访问此网站
尘寰ya27 分钟前
前端面试-垃圾回收机制
java·前端·面试
Mikey_n34 分钟前
Vue + Spring Boot 整合全解析
前端·vue.js·spring boot
腹肌要保暖35 分钟前
深入剖析服务端框架 elpis-core
前端
曼陀罗36 分钟前
怎么判断 open浏览器 还是刷新开着的浏览器窗口
前端