今天要分析下fwk中activity的启动流程之前看别人画的流程图总是很快就忘记了而且总是摸不着重点遇到具体问题时还是不知道从何入手又得从头看起。后来我想通了一件事我们在分析这种源码时不应该过渡纠结于流程图与某个具体函数而应该从宏观角度想想要实现这个功能他应该要包含哪些步骤学习activity启动流程时请带着这样几个问题去阅读源码新的activity是何时被创建的进程内启动activity与启动一个新进程过程有什么区别启动activity时当前的activity应该是要进到后台的那这个时间顺序是怎样的这几个activity的顺序由谁来管理启动过程中的切换动画是什么时候调用的activity启动后activity、window、application是什么时候绑定在一起的这几个问题的答案见我下面的标红部分希望能有助于大家在遇到实际问题时能直接定位到相关节点去分析节省时间。目录具体流程相关类简介具体流程主要流程1.Launcher进程请求调用ATMS系统进程过程2.ATMS向AMS发送创建应用进程的过程3.AMS向Zygote进程发送创建应用进程ActivityThread的过程4.zygote进程接收请求fork并启动应用进程ActivityThread的过程5.应用进程ActivityThread启动activity的过程参考https://blog.csdn.net/allen_xu_2012_new/article/details/131167564简洁流程可以分为两大步骤启动前准备与真正启动。启动前准备在ActivityStarter和ActivityStackSupervisor 类中完成当前activity的暂停并通知新的Activity的启动涉及Intent解析activity在栈中的进出。旧Activity.onPause--新Activity.onCreate-onStart-Resume--旧Activity.onStop。在ActivityThread中完成activity、application的创建和绑定并调用界面显示等具体流程如下Activity的startActivityInstrumentation#execStartActivityActivityManagerNative.getDefault().startActivity;(getDefault()返回的是ActivityManagerService的远程接口ActivityManagerProxy通过binder通信调用ActivityManagerService.startActivity。AMS通知ActivityThread是通过ApplicationThread在frameworks/base/core/java/android/app/ActivityThread.java中和ApplicationThreadProxy。)ActivityStarter.startActivityMayWait 中调用startActivityLocked解析Intent得到更多信息 根据ResolveIntentHelper().resolveIntentInternal chooseBestActivity 去获取最匹配的Activity信息等调用startActivityLockedstartActivity方法startActivityUncheckedActivityStarter.startActivityUnchecked实质会根据信息中launchMode,flag等来计算调度ActivityStack中的taskActivityRecord等;ActivityStack.startActivityLocked(源码为mTargetStack.startActivityLocked。将activity添加到栈顶初始化WindowManager,回到StackSupervisor调用StackSupervisor.resumeTopActivitiesLocked再调回ActivityStack.resumeTopActivityInnerLocked);WindowManagerService.prepareAppTransition 去准备activity跳转动画next.setVisibility 去使得动画可见调用ActivityStack.startPausingLocked暂停交互当前Activity里面通过prev.app.thread.schedulePauseActivity调用ActivityThread.handlePauseActivity,接着调用performPauseActivityIfNeeded然后是Instrumentation 的callActivityOnPause调用activity.performPause();然后的onPause然后调用ActivityManagerNative.getDefault()获取代理对象ActivityManagerProxy.activityPaused告诉ActivityManagerService 旧的Activity已经onPause,可以启动新的Activity了。ActivityStackSupervisor.startSpecificActivityLocked:如果是新进程就调用startProcessLocked如果不是就调用realStartActivityLocked在新进程中启动时会执行到startProcessLocked最终调用ActivityManagerService.startProcessLocked去创建新进程主要是调用Process.start接口来创建一个新的进程新的进程会导入android.app.ActivityThread类并且执行它的main函数ActivityThread.main调用attach方法最终调到ActivityManagerService.attachApplicationLocked里面此时Process并不是application已经创建就调用ActivityStackSupervisor.realStartActivityLocked里面也有更新Configuration去真正启动activity最终调用到ActivityThread.handleLaunchActivityActivityThread.handleLaunchActivity;handleLaunchActivity解析前面传过来的ActivityClientRecord来收集activity的相关信息是前面生成的performLaunchActivity去实例化activity对象和application对象用mInstrumentation.newActivity去实例activity调用LoadedApk.makeApplication去创建application对象若使用了多进程application对象会存在多个。创建Configuration;调用activity.attach把activity、application和window关联起来需要用到Configuration设置应用theme主题通过调用mInstrumentation.callActivityOnCreate去调用Activity.performCreate,里面可以调用onCreate;调用mInstrumentation.callActivityOnRestoreInstanceStatehandleResumeActivity:performResumeActivity;Activity.performResume:performRestart:onResume:decor.setVisibility(View.INVISIBLE);此时视图才可见。切换Activity窗口时Window变化的过程可参考Android窗口管理服务WindowManagerService切换Activity窗口App Transition的过程分析_罗升阳的博客-CSDN博客进程启动流程ActivityManagerService.startProcessLocked--ProcessList.startProcessLock---Process.start---ZygoteProcess.start-----startViaZygote---zygoteSendArgsAndGetResult(参数openZygoteSocketIfNeeded中打开socket和zygote通信)---attemptZygoteSendArgsAndGetResultAndroid应用启动过程相关类简介参考android 从点击图标到启动Activity的流程_ambitionsd的博客-CSDN博客ActivityManagerServices简称AMS服务端对象负责系统中所有Activity的生命周期ActivityThreadApp的真正入口。当开启App之后会调用main()开始运行开启消息循环队列这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合一起完成Activity的管理工作ApplicationThread用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时通过ApplicationThread的代理对象与ActivityThread通讯。ApplicationThreadProxy是ApplicationThread在服务器端的代理负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。Instrumentation每一个应用程序只有一个Instrumentation对象每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家ActivityThread要创建或暂停某个Activity时都需要通过Instrumentation来进行具体的操作。ActivityStack这个并不是我们平时所说的任务栈Activity在AMS的栈管理用来记录已经启动的Activity的先后关系状态信息等。通过ActivityStack决定是否需要启动新的进程。ActivityStack管理了一系列的TaskRecord通过mStackId来唯一标识持有ActivityStackSupervisor的引用。ActivityStackSupervisor这是高版本才有的类它用来管理多个ActivityStack早期的版本只有一个ActivityStack对应着手机屏幕后来高版本支持多屏以后就有了多个ActivityStack于是就引入了ActivityStackSupervisor用来管理多个ActivityStack。ActivityRecordActivityStack的管理对象每个Activity在AMS对应一个ActivityRecord来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。TaskRecord这个才是我们平时所说的任务栈AMS抽象出来的一个“任务”的概念是记录ActivityRecord的栈一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。ActivityStarter:启动activity相关逻辑App与AMS通过Binder进行IPC通信AMS(SystemServer进程)与zygote通过Socket进行IPC通信。另外强烈推荐看下https://www.jianshu.com/p/94816e52cd77这篇文章详细介绍了ActivityRecord、 TaskRecordActivityStack。启动权限问题在ActivityStarter.startActivity中有如下几处权限判断地方展锐平台if(!am.judgeStartAllowLocked(intent, targetPkg, targetUid, callingUid, callingPackage, start-activity)){ return ActivityManager.START_INTENT_NOT_RESOLVED; }ActivityManagerService.judgeStartAllowLocked---PowerControllerInternal.judgeAppLaunchAllowed----BackgroundCleanHelper.judgeAppLaunchAllowed白名单在 Util.mWhiteAppList 和 BackgroundCleanHelper.mInternalWhiteAppListAndroid原生boolean abort !mSupervisor.checkStartAnyActivityPermission(intent, aInfo, resultWho, requestCode, callingPid, callingUid, callingPackage, ignoreTargetSecurity, inTask ! null, callerApp, resultRecord, resultStack); if (abort) Slog.i(TAG,-startActivity for intent checkStartAnyActivityPermission result:false); boolean firewallCheck !mService.getPermissionPolicyInternal().checkStartActivity(intent, callingUid, callingPackage); if (firewallCheck) Slog.i(TAG,-startActivity for intent mIntentFirewall.checkStartActivity result:false); abort | firewallCheck;ActivityManager.checkComponentPermission---PackageManagerService.checkUidPermission----PermissionManagerService.checkUidPermission 通用权限校验PermissionPolicyService.Internal.checkStartActivity----isActionRemovedForCallingPackage判断action在该SDK上是否被移除了判断权限是否需要review.// If permissions need a review before any of the app components can run, we // launch the review activity and pass a pending intent to start the activity // we are to launching now after the review is completed. if (aInfo ! null) { if (mService.getPackageManagerInternalLocked().isPermissionsReviewRequired( aInfo.packageName, userId)) { IIntentSender target mService.getIntentSenderLocked( ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage, callingUid, userId, null, null, 0, new Intent[]{intent}, new String[]{resolvedType}, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT, null); Intent newIntent new Intent(Intent.ACTION_REVIEW_PERMISSIONS);
activity启动流程
今天要分析下fwk中activity的启动流程之前看别人画的流程图总是很快就忘记了而且总是摸不着重点遇到具体问题时还是不知道从何入手又得从头看起。后来我想通了一件事我们在分析这种源码时不应该过渡纠结于流程图与某个具体函数而应该从宏观角度想想要实现这个功能他应该要包含哪些步骤学习activity启动流程时请带着这样几个问题去阅读源码新的activity是何时被创建的进程内启动activity与启动一个新进程过程有什么区别启动activity时当前的activity应该是要进到后台的那这个时间顺序是怎样的这几个activity的顺序由谁来管理启动过程中的切换动画是什么时候调用的activity启动后activity、window、application是什么时候绑定在一起的这几个问题的答案见我下面的标红部分希望能有助于大家在遇到实际问题时能直接定位到相关节点去分析节省时间。目录具体流程相关类简介具体流程主要流程1.Launcher进程请求调用ATMS系统进程过程2.ATMS向AMS发送创建应用进程的过程3.AMS向Zygote进程发送创建应用进程ActivityThread的过程4.zygote进程接收请求fork并启动应用进程ActivityThread的过程5.应用进程ActivityThread启动activity的过程参考https://blog.csdn.net/allen_xu_2012_new/article/details/131167564简洁流程可以分为两大步骤启动前准备与真正启动。启动前准备在ActivityStarter和ActivityStackSupervisor 类中完成当前activity的暂停并通知新的Activity的启动涉及Intent解析activity在栈中的进出。旧Activity.onPause--新Activity.onCreate-onStart-Resume--旧Activity.onStop。在ActivityThread中完成activity、application的创建和绑定并调用界面显示等具体流程如下Activity的startActivityInstrumentation#execStartActivityActivityManagerNative.getDefault().startActivity;(getDefault()返回的是ActivityManagerService的远程接口ActivityManagerProxy通过binder通信调用ActivityManagerService.startActivity。AMS通知ActivityThread是通过ApplicationThread在frameworks/base/core/java/android/app/ActivityThread.java中和ApplicationThreadProxy。)ActivityStarter.startActivityMayWait 中调用startActivityLocked解析Intent得到更多信息 根据ResolveIntentHelper().resolveIntentInternal chooseBestActivity 去获取最匹配的Activity信息等调用startActivityLockedstartActivity方法startActivityUncheckedActivityStarter.startActivityUnchecked实质会根据信息中launchMode,flag等来计算调度ActivityStack中的taskActivityRecord等;ActivityStack.startActivityLocked(源码为mTargetStack.startActivityLocked。将activity添加到栈顶初始化WindowManager,回到StackSupervisor调用StackSupervisor.resumeTopActivitiesLocked再调回ActivityStack.resumeTopActivityInnerLocked);WindowManagerService.prepareAppTransition 去准备activity跳转动画next.setVisibility 去使得动画可见调用ActivityStack.startPausingLocked暂停交互当前Activity里面通过prev.app.thread.schedulePauseActivity调用ActivityThread.handlePauseActivity,接着调用performPauseActivityIfNeeded然后是Instrumentation 的callActivityOnPause调用activity.performPause();然后的onPause然后调用ActivityManagerNative.getDefault()获取代理对象ActivityManagerProxy.activityPaused告诉ActivityManagerService 旧的Activity已经onPause,可以启动新的Activity了。ActivityStackSupervisor.startSpecificActivityLocked:如果是新进程就调用startProcessLocked如果不是就调用realStartActivityLocked在新进程中启动时会执行到startProcessLocked最终调用ActivityManagerService.startProcessLocked去创建新进程主要是调用Process.start接口来创建一个新的进程新的进程会导入android.app.ActivityThread类并且执行它的main函数ActivityThread.main调用attach方法最终调到ActivityManagerService.attachApplicationLocked里面此时Process并不是application已经创建就调用ActivityStackSupervisor.realStartActivityLocked里面也有更新Configuration去真正启动activity最终调用到ActivityThread.handleLaunchActivityActivityThread.handleLaunchActivity;handleLaunchActivity解析前面传过来的ActivityClientRecord来收集activity的相关信息是前面生成的performLaunchActivity去实例化activity对象和application对象用mInstrumentation.newActivity去实例activity调用LoadedApk.makeApplication去创建application对象若使用了多进程application对象会存在多个。创建Configuration;调用activity.attach把activity、application和window关联起来需要用到Configuration设置应用theme主题通过调用mInstrumentation.callActivityOnCreate去调用Activity.performCreate,里面可以调用onCreate;调用mInstrumentation.callActivityOnRestoreInstanceStatehandleResumeActivity:performResumeActivity;Activity.performResume:performRestart:onResume:decor.setVisibility(View.INVISIBLE);此时视图才可见。切换Activity窗口时Window变化的过程可参考Android窗口管理服务WindowManagerService切换Activity窗口App Transition的过程分析_罗升阳的博客-CSDN博客进程启动流程ActivityManagerService.startProcessLocked--ProcessList.startProcessLock---Process.start---ZygoteProcess.start-----startViaZygote---zygoteSendArgsAndGetResult(参数openZygoteSocketIfNeeded中打开socket和zygote通信)---attemptZygoteSendArgsAndGetResultAndroid应用启动过程相关类简介参考android 从点击图标到启动Activity的流程_ambitionsd的博客-CSDN博客ActivityManagerServices简称AMS服务端对象负责系统中所有Activity的生命周期ActivityThreadApp的真正入口。当开启App之后会调用main()开始运行开启消息循环队列这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合一起完成Activity的管理工作ApplicationThread用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时通过ApplicationThread的代理对象与ActivityThread通讯。ApplicationThreadProxy是ApplicationThread在服务器端的代理负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。Instrumentation每一个应用程序只有一个Instrumentation对象每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家ActivityThread要创建或暂停某个Activity时都需要通过Instrumentation来进行具体的操作。ActivityStack这个并不是我们平时所说的任务栈Activity在AMS的栈管理用来记录已经启动的Activity的先后关系状态信息等。通过ActivityStack决定是否需要启动新的进程。ActivityStack管理了一系列的TaskRecord通过mStackId来唯一标识持有ActivityStackSupervisor的引用。ActivityStackSupervisor这是高版本才有的类它用来管理多个ActivityStack早期的版本只有一个ActivityStack对应着手机屏幕后来高版本支持多屏以后就有了多个ActivityStack于是就引入了ActivityStackSupervisor用来管理多个ActivityStack。ActivityRecordActivityStack的管理对象每个Activity在AMS对应一个ActivityRecord来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。TaskRecord这个才是我们平时所说的任务栈AMS抽象出来的一个“任务”的概念是记录ActivityRecord的栈一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。ActivityStarter:启动activity相关逻辑App与AMS通过Binder进行IPC通信AMS(SystemServer进程)与zygote通过Socket进行IPC通信。另外强烈推荐看下https://www.jianshu.com/p/94816e52cd77这篇文章详细介绍了ActivityRecord、 TaskRecordActivityStack。启动权限问题在ActivityStarter.startActivity中有如下几处权限判断地方展锐平台if(!am.judgeStartAllowLocked(intent, targetPkg, targetUid, callingUid, callingPackage, start-activity)){ return ActivityManager.START_INTENT_NOT_RESOLVED; }ActivityManagerService.judgeStartAllowLocked---PowerControllerInternal.judgeAppLaunchAllowed----BackgroundCleanHelper.judgeAppLaunchAllowed白名单在 Util.mWhiteAppList 和 BackgroundCleanHelper.mInternalWhiteAppListAndroid原生boolean abort !mSupervisor.checkStartAnyActivityPermission(intent, aInfo, resultWho, requestCode, callingPid, callingUid, callingPackage, ignoreTargetSecurity, inTask ! null, callerApp, resultRecord, resultStack); if (abort) Slog.i(TAG,-startActivity for intent checkStartAnyActivityPermission result:false); boolean firewallCheck !mService.getPermissionPolicyInternal().checkStartActivity(intent, callingUid, callingPackage); if (firewallCheck) Slog.i(TAG,-startActivity for intent mIntentFirewall.checkStartActivity result:false); abort | firewallCheck;ActivityManager.checkComponentPermission---PackageManagerService.checkUidPermission----PermissionManagerService.checkUidPermission 通用权限校验PermissionPolicyService.Internal.checkStartActivity----isActionRemovedForCallingPackage判断action在该SDK上是否被移除了判断权限是否需要review.// If permissions need a review before any of the app components can run, we // launch the review activity and pass a pending intent to start the activity // we are to launching now after the review is completed. if (aInfo ! null) { if (mService.getPackageManagerInternalLocked().isPermissionsReviewRequired( aInfo.packageName, userId)) { IIntentSender target mService.getIntentSenderLocked( ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage, callingUid, userId, null, null, 0, new Intent[]{intent}, new String[]{resolvedType}, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT, null); Intent newIntent new Intent(Intent.ACTION_REVIEW_PERMISSIONS);