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

相关推荐
xiangpanf9 小时前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx12 小时前
安卓线程相关
android
消失的旧时光-194313 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon13 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon14 小时前
VSYNC 信号完整流程2
android
dalancon14 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户693717500138415 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android15 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才16 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶16 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle