activity启动流程

activity的启动过程

总结

  • Launcher通过Binder机制(跨进程通信)通知AMS启动一个Activity,AMS使Launcher栈最顶端Activity进入onPause状态
  • AMS通知Process使用Socket和Zygote进程通信,请求创建一个新进程,Zygote收到Socket请求,fork出一个进程,并调用ActivityThread#main()
  • ActivityThread通过Binder通知AMS启动应用程序,AMS通知ActivityStackSupervisor真正的启动Activity
  • ActivityStackSupervisor通知ApplicationThread启动Activity,ApplicationThread发消息给ActivityThread,需要启动一个Activity
  • ActivityThread收到消息之后,通知LoadedApk创建Applicaition,并且调用其onCteate()方法
  • ActivityThread装载目标Activity类,并调用Activity#attach(),ActivityThread通知Instrumentation调用Activity#onCreate()
第一次启动应用程序,Application和Activity#onCreate()方法调用顺序

装载Activity
装载Application
Application#attach()
Application#onCreate()
Activity#attach()
Activity#onCreate()

栈顶的Activity onPause

click app图标—Launcher/Activity.startActivity—AMS启动哪个APP,哪个activity,AMS检查APP的AndroidManifest文件该activity是否注册—建立Activity对象/ActivityRecord,加入到TaskRecord中,根据相应的LaunchMode和Flag进行相应的进栈出栈处理—AMS发送消息通知栈顶的activity暂停—Launcher通知AMS已暂停—AMS开始启动目标Activity

创建新的进程和绑定Application

调用zygote并通过socket通信的方式让zygote进程fork出一个新的进程,并根据传递的“android.app.ActivityThread”字符串,反射出该对象并执行main入口函数,

创建MainLooper

执行attach方法,通过AMS为应用绑定Application,执行ActivityThread.ApplicationThread.bindApplication/ApplicationThread是activityThread类的内部类,是一个Binder对象,会传给AMS,留作以后通信用—application.onCreate

avtivity的启动

executeLifecycleState—ActivityThread.handleLaunchActivity—performLaunchActivity—handleResumeActivity

performLaunchActivity
  • step 1: 创建LoadedApk对象,packageInfo
  • step 2: 创建Activity对象,mInstrumentation.newActivity
  • step 3: 创建Application对象
  • step 4: 创建ContextImpl对象
  • step 5: 将Application/ContextImpl都attach到Activity对象
  • step 6: 执行回调onCreate
  • Step 7: activity.performStart();//执行回调onStart

Instrumentation用来监控应用程序和系统之间的交互操作,系统要启动Activity,需要使用Instrumentation来启动,Launcher的Instrumentation在前面分析过,它在ActivityThread的attach方法中被构造出来,传递给Activity的attach方法

Launcher界面运行在自己的进程中,AMS也运行在自己的进程中,这是一个跨进程的通讯,因此,Launcher必须先获得AMS的远程代理Binder,才能向AMS发送数据。

getDefault()获得一个AMS的代理对象ActivityManagerProxy,调用startActivity将数据传递给AMS,通知AMS启动新的Activity。先看代理的获取过程

Instrumentation调用Activity#performCreate(),在Activity#performCreate()中调用自身onCreate()方法

当我们点击图标的时候,系统就会调用startActivitySately(),一般情况下,我们所启动的activity的相关信息都会保存在intent中,比如action,category等等。我们在安装这个应用的时候,系统也会启动一个PackaManagerService的管理服务,这个管理服务会对AndroidManifest.xml文件进行解析,从而得到应用程序中的相关信息,比如service,activity,Broadcast等等,然后获得相关组件的信息。当我们点击应用图标的时候,就会调用startActivitySately()方法,而这个方法内部则是调用startActivty(),而startActivity()方法最终还是会调用startActivityForResult()这个方法。而在startActivityForResult()这个方法。因为startActivityForResult()方法是有返回结果的,所以系统就直接给一个-1,就表示不需要结果返回了。而startActivityForResult()这个方法实际是通过Instrumentation类中的execStartActivity()方法来启动activity,Instrumentation这个类主要作用就是监控程序和系统之间的交互。而在这个execStartActivity()方法中会获取ActivityManagerService的代理对象,通过这个代理对象进行启动activity。启动会就会调用一个checkStartActivityResult()方法,如果说没有在配置清单中配置有这个组件,就会在这个方法中抛出异常了。当然最后是调用的是Application.scheduleLaunchActivity()进行启动activity,而这个方法中通过获取得到一个ActivityClientRecord对象,而这个ActivityClientRecord通过handler来进行消息的发送,系统内部会将每一个activity组件使用ActivityClientRecord对象来进行描述,而ActivityClientRecord对象中保存有一个LoaderApk对象,通过这个对象调用handleLaunchActivity来启动activity组件,而页面的生命周期方法也就是在这个方法中进行调用

学习参考博客

https://www.jianshu.com/p/d4aee38f1ccd

Android系统启动的核心流程如下:

1、启动电源以及系统启动:当电源按下时引导芯片从预定义的地方(固化在ROM)开始执行,加载引导程序BootLoader到RAM,然后执行。

2、引导程序BootLoader:BootLoader是在Android系统开始运行前的一个小程序,主要用于把系统OS拉起来并运行。

3、Linux内核启动:当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当其完成系统设置时,会先在系统文件中寻找init.rc文件,并启动init进程。

4、init进程启动:初始化和启动属性服务,并且启动Zygote进程。

5、Zygote进程启动:创建JVM并为其注册JNI方法,创建服务器端Socket,启动SystemServer进程。

6、SystemServer进程启动:启动Binder线程池和SystemServiceManager,并且启动各种系统服务。

7、Launcher启动:被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到系统桌面上。

插件化的2个方案

https://juejin.im/post/6844903613865672718#heading-5

hook IActivityManager
startActivity
占坑activity替换testactivity

activityThread handler callback
还原testactivity

hook instrumentation
execStartActivity

newActivity

hook basedexClassLoader
加载asset资源
https://www.jianshu.com/p/b5cfc12deacc

Replugin
https://www.codercto.com/soft/d/12276.html

ActivityThread的理解和APP的启动过程
https://blog.csdn.net/hzwailll/article/details/85339714

当bootloader启动后,启动kernel,kernel启动完后,在用户空间启动init进程,再通过init进程,来读取init.rc中的相关配置
Init进程启动后,最重要的一个进程就是Zygote进程,Zygote是所有应用的鼻祖。SystemServer和其他所有Dalivik虚拟机进程都是由Zygote fork而来
Zygote fork的第一个进程就是SystemServer

ActivityManagerService简称AMS,具有管理Activity行为、控制activity的生命周期、派发消息事件、内存管理等功能
在AMS的最后启动了Launcher进程

Launcher的启动经过了三个阶段:
第一个阶段:SystemServer完成启动Launcher Activity的调用
第二个阶段:Zygote()进行Launcher进程的Fork操作
第三个阶段:进入ActivityThread的main(),完成最终Launcher的onCreate操作

应用的启动
. 点击桌面的图标,Launcher调用系统的startActivity进行启动Activity,此时的动作在Launcher进程中

.	ATM\AMS 进行Activity的处理,组装message,通过socket发送给Socket

.	Zygote收到SystemServer发来的消息,进行消息拆分,再调用系统的fork()函数,进行进行孵化操作。

.	进入ActivityThread的main(),完成最终应用进程的的onCreate操作

启动大纲
. Launcher请求AMS。
. AMS请求ApplicationThread。
. ActivityThread启动Activity。

	当我们点击应用程序的图标时,就会自动调用Launcher的startActivitySafely方法, 最终会调用Activity的startActivity方法。

	在Activity的startActivity中又调用了startActivityForResult方法,而startActivityForResult方法内部又调用了Instrumentation的execStartActivity方法。

	在Instrumentation的execStartActivity方法中又通过ActivityManager的getService方法获取了IBinder类型的AMS引用IActivityManager,最后调用了AMS的startActivity方法。



	在AMS的startActivity方法中,又调用了其本身的startActivityAsUser方法,进行权限的检查。

	权限检查完后,调用ActivityStarter的startActivityMayWait方法,并在该方法中解析处理应用程序需要的参数,并进行相关参数的初始化,最终会调用其startActivity方法。而在startActivity方法中又调用了startActivityUnchecked方法来处理与栈管理相关的逻辑。

	在处理完栈的关系后,紧接着会调用ActivityStackSupervisor的resumeFocusedStackTopActivityLocked方法获取需要启动的Activity所在栈的栈顶。

	当需要启动的Activity的状态不是RESUMED状态,就需要调用ActivityStack的resumeTopActivityUncheckedLocked方法,而它的内部又调用了resumeTopActivityInnerLocked方法进行一系列的栈状态的判断,最终又回调了ActivityStackSupervisor的startSpecificActivityLocked方法。

	在ActivityStackSupervisor的startSpecificActivityLocked方法中先是获取了即将启动的Activity所在的应用程序进程(就是在这个地方判断应用所在进程是否存在且已启动,如果没有启动,就需要启动应用程序进程),然后调用realStartActivityLocked方法。

	在ActivityStackSupervisor的realStartActivityLocked方法中,对启动的应用程序进程进行一系列的判断和处理,最终会调用IBinder类型的ApplicationThread引用IApplicationThread,通过传入IApplicationThread建立ClientTransaction,加入执行LaunchActivityItem任务,最终实现跨进程执行调用ActivityThread的handleLaunchActivity方法。


	在ActivityThread调用了它的handleLaunchActivity方法中,会先调用其performLaunchActivity方法,之后调用handleResumeActivity,将Activity的状态置为Resume。

	在ActivityThread的performLaunchActivity方法中做了很多事情。

.	首先,执行了createBaseContextForActivity方法,创建要启动Activity的上下文;
.	其次,调用执行了Instrumentation的newActivity方法来创建Activity实例;
.	接着,调用LoadedApk的makeApplication方法,创建应用程序的Application;
.	之后,调用需要启动的Activity的attach方法初始化Activity,创建Window对象并与Activity自身进行关联。
.	最后,调用执行了Instrumentation的callActivityOnCreate方法来启动Activity。
	在Instrumentation执行了callActivityOnCreate方法中,会调用Activity的performCreate方法,最终会调用Activity的onCreate方法,这样应用程序也就启动了

说说Activity的启动流程
https://blog.csdn.net/weixin_44339238/article/details/104925541

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值