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

相关推荐
AI浩4 小时前
【Labelme数据操作】LabelMe标注批量复制工具 - 完整教程
运维·服务器·前端
涔溪4 小时前
CSS 网格布局(Grid Layout)核心概念、基础语法、常用属性、实战示例和进阶技巧全面讲解
前端·css
2401_878454535 小时前
浏览器工作原理
前端·javascript
西陵5 小时前
为什么说 AI 赋能前端开发,已经不是选择题,而是必然趋势?
前端·架构·ai编程
by__csdn6 小时前
Vue3 setup()函数终极攻略:从入门到精通
开发语言·前端·javascript·vue.js·性能优化·typescript·ecmascript
天天扭码6 小时前
前端如何实现RAG?一文带你速通,使用RAG实现长期记忆
前端·node.js·ai编程
Luna-player7 小时前
在前端中,<a> 标签的 href=“javascript:;“ 这个是什么意思
开发语言·前端·javascript
lionliu05197 小时前
js的扩展运算符的理解
前端·javascript·vue.js
小草cys7 小时前
项目7-七彩天气app任务7.4.2“关于”弹窗
开发语言·前端·javascript
奇舞精选7 小时前
GELab-Zero 技术解析:当豆包联手中兴,开源界如何守住端侧 AI 的“最后防线”?
前端·aigc