当前位置:首页 > 综合热点 > 正文

app完整的启动过程 main方法的作用

摘要: app完整的启动过程main方法的作用最佳答案53678位专家为你答疑解惑app完整的启动过程main方法的作用程序启动的完整过...

app完整的启动过程 main方法的作用

最佳答案 53678位专家为你答疑解惑

app完整的启动过程 main方法的作用

程序启动的完整过程:

1、先执行main函数,main内部会调用UIApplicationMain函数,该函数的声明如下:

intUIApplicationMain(intargc,charargv[], NSString principalClassName, NSString *delegateClassName)。

argc、argv:标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可

principalClassName:指定应用程序类,该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值

delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议。

2、在UIApplicationMain函数里面做了如下几件事情:

(1)、根据传入的第三个参数创建UIApplication对象或它的子类对象。如果该参数为nil,直接使用该UIApplication来创建。(该参数只能传人UIApplication或者是它的子类)

(2)、根据传入的第四个参数创建AppDelegate对象,并将该对象赋值给第1步创建的UIApplication对象的delegate属性。

(3)、开启一个事件循环,循环监控应用程序发生的事件。每监听到对应的系统事件时,就会通知AppDelegate。

3、分两种情况:

(1)有stroyboard

>应用程创建一个UIWindow对象(继承自UIView),并设置为AppDelegate的window属性。

>加载Info.plist文件,读取最主要storyboard文件的名称。

>加载最主要的storyboard文件,创建白色箭头所指的控制器对象。并且设置控制器为UIWindow的rootViewController属性(根控制器)。

>展示UIWindow,展示之前会将添加rootViewController的view到UIWindow上面(在这一步才会创建控制器的view),其内部会执行该行代码:[window addSubview: window.rootViewControler.view];

(2)没有stroyboard

>首先会调用delegate对象的application:didFinishLaunchingWithOptions:方法。

>在application:didFinishLaunchingWithOptions:方法中需要主动创建UIWindow对象。并设置为AppDelegate的window属性。

>主动创建一个UIViewController对象,并赋值给window的rootViewController属性。

>调用window的makeKeyAndVisible方法显示窗口。

Main方法的作用:

1.根据第三个参数创建UIApplication对象,该对象为空就是默认创建UIApplication对象,该参数只能是UIApplication或者UIApplication的子类

该参数的写法可以有: nil,@“UIApplication”,NSStringFromClass([UIApplication class])

2.根据第四个参数创建应用程序代理,并将代理对象设置给application对象的delegate属性

3.开启时间循环,包括应用程序的循环运行,并开始处理用户事件

4.根据info.plist加载最主要的storyboard文件(默认是Main.storyboard,创建箭头指向的控制器(默认是viewController)

简要分析安卓App启动流程

在开始分析app启动流程之前,我们先回想下平时是怎么启动一款App的:打开Android系统桌面->点击应用图标->启动App。从用户角度来看,这个过程看起来很简单,但是app的背后又隐藏着哪些流程呢?做安卓开发这么多年,觉得还是有必要认真分析一下,下文就借助友盟+u-apm,针对安卓app启动流程进行简要分析!

Android中每一个App都在一个独立的空间,运行在一个单独的进程中,拥有一个vm,系统会分配一个唯一的user ID。init进程会启动一个"Zygote"进程。这个进程初始化了第一个VM,并且预加载了framework和众多app所需要的通用资源。然后它开启一个Socket接口来监听请求,根据请求孵化出新的VM来管理新的app进程。一旦收到新的请求,Zygote会基于自身预先加载的VM来孵化出一个新的VM创建一个新的进程。Zygote还会孵化出一个超级管理进程---System Server。SystemServer会启动所有系统核心服务: 引导服务(7个):ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService; 核心服务(3个):BatteryService、UsageStatsService、WebViewUpdateService; 其他服务(70个+):AlarmManagerService、VibratorService等。

启动App流程

启动一个App的方式

启动一个应用时:都会调用startActivity(Intent)

 Activity.startActivity

这里mMainThread也是Activity类的成员变量,它的类型是ActivityThread,mMainThread.getApplicationThread获得它里面的ApplicationThread成员变量,这个ApplicationThread实际上是一个Binder对象,是App所在的进程与AMS所在进程system_server通信的桥梁。1、AMS会对Activity生命周期的管理以及任务栈的管理,通过Binder通信,这时AMS是Server端,App进程持有AMS的client端IActivityManagerSingleton进行通信。2、AMS在完成任务栈和生命周期管理后,回调App方法,这时AMS是client持有App的ApplicationThread进行通信。

mToken是Activity中一个成员变量,AMS和Activity交互中并没有把Activity实例传入,而是使用mToken,可以唯一标示Activity。

Instrumentation.execStartActivity

这里把App中Binder的Server端的ApplicationThread的句柄传给AMS,用于生命周期的回调等,如onPause。通过Binder驱动,就进入AMS的startActivity方法。

ActivityManagerService 通知当前进程进入pause状态

AMS在system_server进程中,由于AMS中代码太多了,我们这里就不全部展开讲了,大概的说一下。有兴趣的可以去看一下老罗的文章。在AMS会新创建一个栈Task,并通过ApplicationThread的句柄通知当前Activity进入paused状态。

回到ActivityThread中

通知AMS已经暂停,启动新的App

暂停当前Activity后,通知AMS已经暂停,可以继续AMS还没完成的事,启动新的App,主要是调用了Process.start函数,通过LocalSocket和ZygoteServer通信,fork一个新的进程。注意这里使用的是Socket通信,并不是Binder。因为zygote进程内加载了preload()方法中的所有资源,当需要fork新进程时,采用copy on write技术,所以fork出的新进程可以直接使用预加载的资源,并调用ZygoteInit.nativeZygoteInit()执行Binder驱动程序初始化的相关工作了,才使得进程中的Binder对象能够顺利地进行Binder进程间通信,最后执行新进程中的android.app.ActivityThread类中的Main函数,在main函数调用了attach,接着又调用AMS的attachApplication,用于生命周期的回调。

通过Binder驱动程序,执行流程又回到AMS中,调用ActivityManagerService的attachApplication函数中,主要做了2件事:1、通过Binder驱动程序调用ApplicationThread的bindApplication。 2、通过Binder驱动调用ApplicationThread的scheduleLaunchActivity。

通过Binder驱动程序调用ApplicationThread的bindApplication。然后利用mH.sendMessage最终会执行到ActivityThread中的handleBindApplication函数,在这个函数主要是创建了Application,并调用了attach和onCreate方法。

 创建Activity

通过Binder驱动程序调用ApplicationThread的scheduleLaunchActivity。然后利用mH.sendMessage最终会执行到ActivityThread中的handleLaunchActivity函数,在这个函数主要是创建了Activity,并调用了attach和onCreate等生命周期方法。

调用performLaunchActivity,创建Activity,并调用onCreate,onStart,onPostCreate以及onRestoreInstanceState(分情况调用),接下来我们继续看:

调用handleResumeActivity,调用onResume,onPostResume生命周期方法,然后调用makeVisible,添加View到WindowManager,WindowManager的实现类是WindowManagerImpl,WindowManagerImpl的addView又调用了WindowManagerGloble.addView,创建ViewRootImpl对象,并调用了setView函数。

当线程空闲的时候,调用AMS的activityIdle,最终会调回ApplicationThread.scheduleStopActivity.

最后Activity进入Resumed,并通知AMS

到这里一个新的App,就完成启动了,整个App启动过程执行了很多步骤,下图就是分析步骤了,可以方便大家有更好的理解。

以上的就是关于安卓app启动流程的介绍了,各位开发者可以使用友盟+u-apm这款检测工具对app启动流程进行分析,友盟+U-APM通过轻量级的集成接入即可拥有实时、可靠、全面的应用崩溃、ANR、自定义异常等捕获能力,及卡顿、启动分析等性能能力,支持多场景、多通道智能告警监控,帮助开发者高效还原异常、卡顿用户的访问路径和业务现场,缩短故障排查时间。另外,还提供了“云真机”服务,友盟+云真机搭载在U-APM应用性能监控平台上,U-APM提供了灵活地测试操作界面,支持ADB调试、WEB远程调试、扫码、抓包、虚拟定位等测试功能,并提供了测试报告供开发者后续查看。

发表评论