上篇,我们聊完了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
**符号绑定。 ObjC
的runtime
初始化 (ObjC setup):ObjC
相关Class
的注册、category
注册、selector
唯一性检查等。- 初始化(Initializers) :执行
+load()
方法、用attribute((constructor))
修饰的函数的调用、创建C++
静态全局变量等。
(2)main()阶段:
- dyld调用main()
- 调用UIApplicationMain()
- 调用applicationWillFinishLaunching
- 调用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程序
- 点击画线button创建App
- 创建Empty Activity,点击 Next
- 使用截图配置,点击Finish创建App
- 点击画线区域切换为Project模式
- 鼠标右键点击画线出,选择 New -> Kotlin Class/File,输入类名'CostomApplication'
- 在文件中,写入如下代码
kotlin
override fun onCreate() {
super.onCreate()
Log.e("lanching", "Application = onCreate:++ ", )
}
- 在'AndroidManifest.xml',添加画线配置
- 在MainActivity中,添加日志输出的代码
- 如果没有模拟器,可以点击第一个红线,然后点击第二个红线创建设备
- 点击运行,可以看到APP确实先创建了Application,然后创建在MainActivity
总结:通过上面的Android启动Demo,我们从代码成面上验证了APP启动会先创建Application,然后创建在MainActivity,我们可以根据具体的需求,在每个流程添加具体的功能代码。上面我们将的其他流程,是操作系统行为,我们只需要了解即可。
三、iOS中APP启动Demo
1、安装xcode
2、创建Demo程序
- 点击 Create New Proect,创建项目
- 选择创建iOS的App
- 输入项目名称,点击Next,然后选择项目目录,点击Create
- 在创建的项目中,main文件里面添加日志代码
- 在AppDelegate文件里面添加日志代码
- 在ViewController文件里面添加日志代码
7.点击画线区域选择模拟器,点击运行,就可以看到流程日志打印
总结:通过上面的iOS启动Demo,我们从代码成面上验证了iOS的APP启动会先执行main函数创建UIApplication实列,然后执行Appdelegate的didFinishLaunchingWithOptions方法,最后加载首页的ViewController
四、整体总结
通过上面的介绍,我想大家对Android和iOS中App的启动流程有了一定的了解,在App开发过程中,上面的流程已经能过覆盖我们绝大多数的需求,但是如果感兴趣想深入了解App的启动流程,可以查阅相关知识继续深入