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

相关推荐
我要洋人死1 小时前
导航栏及下拉菜单的实现
前端·css·css3
科技探秘人1 小时前
Chrome与火狐哪个浏览器的隐私追踪功能更好
前端·chrome
科技探秘人1 小时前
Chrome与傲游浏览器性能与功能的深度对比
前端·chrome
JerryXZR1 小时前
前端开发中ES6的技术细节二
前端·javascript·es6
七星静香1 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
q2498596931 小时前
前端预览word、excel、ppt
前端·word·excel
小华同学ai1 小时前
wflow-web:开源啦 ,高仿钉钉、飞书、企业微信的审批流程设计器,轻松打造属于你的工作流设计器
前端·钉钉·飞书
Gavin_9151 小时前
【JavaScript】模块化开发
前端·javascript·vue.js
懒大王爱吃狼2 小时前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
逐·風6 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#