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的启动流程,可以查阅相关知识继续深入

相关推荐
轻口味4 分钟前
【每日学点鸿蒙知识】AVCodec、SmartPerf工具、web组件加载、监听键盘的显示隐藏、Asset Store Kit
前端·华为·harmonyos
alikami6 分钟前
【若依】用 post 请求传 json 格式的数据下载文件
前端·javascript·json
吃杠碰小鸡41 分钟前
lodash常用函数
前端·javascript
emoji1111111 小时前
前端对页面数据进行缓存
开发语言·前端·javascript
泰伦闲鱼1 小时前
nestjs:GET REQUEST 缓存问题
服务器·前端·缓存·node.js·nestjs
m0_748250031 小时前
Web 第一次作业 初探html 使用VSCode工具开发
前端·html
一个处女座的程序猿O(∩_∩)O1 小时前
vue3 如何使用 mounted
前端·javascript·vue.js
m0_748235951 小时前
web复习(三)
前端
AiFlutter1 小时前
Flutter-底部分享弹窗(showModalBottomSheet)
java·前端·flutter
麦兜*1 小时前
轮播图带详情插件、uniApp插件
前端·javascript·uni-app·vue