Android Activity组件与进程启动间关系

Activity、Service、ContentProvider、BroadcastReceiver这四大组件,在启动的过程中,当其承载的进程不存在时需要调用startProcessLocked先创建进程。

下面以launcher activtity的启动流程为例

java 复制代码
@frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java
                                                    Service.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason, taskDisplayArea);
@frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
                                                        mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason).setActivityOptions(options.toBundle()).execute();
                                                            res = executeRequest(mRequest);
                                                                ActivityRecord r = new ActivityRecord.Builder(mService)..setActivityInfo(aInfo)
                                                                mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
                                                                    result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity,
                                                                        mTargetRootTask.startActivityLocked(mStartActivity,
@frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
                                                                        mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetRootTask, mStartActivity, mOptions, mTransientLaunch);
                                                                            final Task focusedRoot = display.getFocusedRootTask();
@frameworks/base/services/core/java/com/android/server/wm/Task.java
                                                                            focusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions);
                                                                                someActivityResumed = resumeTopActivityInnerLocked(prev, options, deferPause);
@frameworks/base/services/core/java/com/android/server/wm/TaskFragment.java
                                                                                    resumed[0] = topFragment.resumeTopActivity(prev, options, deferPause);
                                                                                        ActivityRecord next = topRunningActivity(true /* focusableOnly */);
                                                                                        pausing |= startPausing(mTaskSupervisor.mUserLeaving, false /* uiSleeping */, next, "resumeTopActivity");  //这里就是stop上一个activity的地方
                                                                                        if (next.attachedToProcess()) {   //要启动的activity所在的进程已经起来了,直接通过事务的形式去启动activity
                                                                                            final ClientTransaction transaction = ClientTransaction.obtain(next.app.getThread(), next.appToken);
                                                                                            mAtmService.getLifecycleManager().scheduleTransaction(transaction);
                                                                                        } else {   //如果进程没启动,调用ActivityTaskSupervisor的startSpecificActivity
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
                                                                                            mTaskSupervisor.startSpecificActivity(next, true, true);
@base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
                                                                                                mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
                                                                                                    final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess, mAmInternal, activity.processName,
                                                                                                    mH.sendMessage(m);
                                                                                                        LocalService::startProcess  //class LocalService extends ActivityManagerInternal
                                                                                                            startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */, new HostingRecord(hostingType, hostingName, isTop),
@frameworks/base/services/core/java/com/android/server/am/ProcessList.java
                                                                                                                return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
                                                                                                                    startProcessLocked(app, hostingRecord, zygotePolicyFlags, abiOverride);
                                                                                                                        startProcessLocked(app, hostingRecord, zygotePolicyFlags, false
                                                                                                                            startProcessLocked(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,
                                                                                                                                mService.mProcStartHandler.post(() -> handleProcessStart( app,
                                                                                                                                    handleProcessStartedLocked(app, startResult, startSeq);
                                                                                                                                        return handleProcessStartedLocked(pending, startResult.pid, startResult.usingWrapper,
                                                                                                                                            buf.append("Start proc ");  //Start proc 1486:com.android.launcher/1000 for top-activity {com.android.launcher/com.android.launcher.MainActivity}
                                                                                                                                            buf.append(pid);
                                                                                                                                            buf.append(':');
                                                                                                                                            buf.append(app.processName);
                                                                                                                                            buf.append('/');
                                                                                                                                            buf.append(app.getHostingRecord().getType());
                                                                                                                                            buf.append(app.getHostingRecord().getName());
                                                                                                                                            
                                                                                                                                            ..............
@src/main/java/com/dynabook/launcher/MainActivity.java
                                                                                                                                                MainActivity::onCreate 

@frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java

Service.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason, taskDisplayArea);

@frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java

mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason).setActivityOptions(options.toBundle()).execute();

res = executeRequest(mRequest);

ActivityRecord r = new ActivityRecord.Builder(mService)..setActivityInfo(aInfo)

mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,

result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity,

mTargetRootTask.startActivityLocked(mStartActivity,

@frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java

mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetRootTask, mStartActivity, mOptions, mTransientLaunch);

final Task focusedRoot = display.getFocusedRootTask();

@frameworks/base/services/core/java/com/android/server/wm/Task.java

focusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions);

someActivityResumed = resumeTopActivityInnerLocked(prev, options, deferPause);

@frameworks/base/services/core/java/com/android/server/wm/TaskFragment.java

resumed[0] = topFragment.resumeTopActivity(prev, options, deferPause);

ActivityRecord next = topRunningActivity(true /* focusableOnly */);

pausing |= startPausing(mTaskSupervisor.mUserLeaving, false /* uiSleeping */, next, "resumeTopActivity"); //这里就是stop上一个activity的地方

if (next.attachedToProcess()) { //要启动的activity所在的进程已经起来了,直接通过事务的形式去启动activity

final ClientTransaction transaction = ClientTransaction.obtain(next.app.getThread(), next.appToken);

mAtmService.getLifecycleManager().scheduleTransaction(transaction);

} else { //如果进程没启动,调用ActivityTaskSupervisor的startSpecificActivity

@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java

mTaskSupervisor.startSpecificActivity(next, true, true);

@base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");

final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess, mAmInternal, activity.processName,

mH.sendMessage(m);

LocalService::startProcess //class LocalService extends ActivityManagerInternal

startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */, new HostingRecord(hostingType, hostingName, isTop),

@frameworks/base/services/core/java/com/android/server/am/ProcessList.java

return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,

startProcessLocked(app, hostingRecord, zygotePolicyFlags, abiOverride);

startProcessLocked(app, hostingRecord, zygotePolicyFlags, false

startProcessLocked(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,

mService.mProcStartHandler.post(() -> handleProcessStart( app,

handleProcessStartedLocked(app, startResult, startSeq);

return handleProcessStartedLocked(pending, startResult.pid, startResult.usingWrapper,

buf.append("Start proc "); //Start proc 1486:com.android.launcher/1000 for top-activity {com.android.launcher/com.android.launcher.MainActivity}

buf.append(pid);

buf.append(':');

buf.append(app.processName);

buf.append('/');

buf.append(app.getHostingRecord().getType());

buf.append(app.getHostingRecord().getName());

..............

@src/main/java/com/dynabook/launcher/MainActivity.java

MainActivity::onCreate

相关推荐
q***57744 分钟前
MySql的慢查询(慢日志)
android·mysql·adb
JavaNoober28 分钟前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
城东米粉儿1 小时前
关于ObjectAnimator
android
zhangphil2 小时前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android
火柴就是我3 小时前
从头写一个自己的app
android·前端·flutter
lichong9514 小时前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端
用户69371750013845 小时前
14.Kotlin 类:类的形态(一):抽象类 (Abstract Class)
android·后端·kotlin
火柴就是我5 小时前
NekoBoxForAndroid 编译libcore.aar
android
Kaede66 小时前
MySQL中如何使用命令行修改root密码
android·mysql·adb
明君879977 小时前
Flutter 图纸标注功能的实现:踩坑与架构设计
android·ios