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