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

相关推荐
长天一色几秒前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
NiNg_1_23418 分钟前
npm、yarn、pnpm之间的区别
前端·npm·node.js
秋殇与星河20 分钟前
CSS总结
前端·css
BigYe程普42 分钟前
我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程
开发语言·前端·chrome·chatgpt·reactjs·个人开发
余生H1 小时前
前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
前端·javascript·node.js·全栈
程序员-珍1 小时前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
axihaihai1 小时前
网站开发的发展(后端路由/前后端分离/前端路由)
前端
流烟默1 小时前
Vue中watch监听属性的一些应用总结
前端·javascript·vue.js·watch
2401_857297911 小时前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
茶卡盐佑星_2 小时前
meta标签作用/SEO优化
前端·javascript·html