Android Home应用程序启动流程

Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了,本文将详细分析Launcher应用程序的启动过程。

cpp 复制代码
@frameworks/base/services/core/java/com/android/server/am/UserController.java
finishUserUnlocking
    mHandler.obtainMessage(USER_UNLOCK_MSG, userId, 0, uss).sendToTarget();
        case USER_UNLOCK_MSG: finishUserUnlocked
            finishUserUnlockedCompleted
                mHandler.obtainMessage(USER_UNLOCKED_MSG, userId, 0).sendToTarget();
                    case USER_UNLOCKED_MSG: mInjector.getSystemServiceManager().onUserUnlocked(msg.arg1);
                        mService.mTaskSupervisor.onUserUnlocked(user.getUserIdentifier());
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
                            scheduleStartHome("userUnlocked");
                                mHandler.obtainMessage(START_HOME_MSG, reason).sendToTarget();
                                    case START_HOME_MSG: { mRootWindowContainer.startHomeOnEmptyDisplays((String) msg.obj);    
                                    @frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
                                        startHomeOnEmptyDisplays
                                            forAllTaskDisplayAreas(taskDisplayArea -> {
                                                startHomeOnTaskDisplayArea(mCurrentUser, myReason, taskDisplayArea,        
@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.dynabook.VDlauncher/1000 for top-activity {com.dynabook.VDlauncher/com.dynabook.VDlauncher.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/VDlauncher/MainActivity.java
                                                                                                                                                MainActivity::onCreate 

--------------------------------------------回归线---------------------------------

@frameworks/base/services/core/java/com/android/server/am/UserController.java finishUserUnlocking mHandler.obtainMessage(USER_UNLOCK_MSG, userId, 0, uss).sendToTarget(); case USER_UNLOCK_MSG: finishUserUnlocked finishUserUnlockedCompleted mHandler.obtainMessage(USER_UNLOCKED_MSG, userId, 0).sendToTarget(); case USER_UNLOCKED_MSG: mInjector.getSystemServiceManager().onUserUnlocked(msg.arg1); mService.mTaskSupervisor.onUserUnlocked(user.getUserIdentifier()); @frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java scheduleStartHome("userUnlocked"); mHandler.obtainMessage(START_HOME_MSG, reason).sendToTarget(); case START_HOME_MSG: { mRootWindowContainer.startHomeOnEmptyDisplays((String) msg.obj); @frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java startHomeOnEmptyDisplays forAllTaskDisplayAreas(taskDisplayArea -> { startHomeOnTaskDisplayArea(mCurrentUser, myReason, taskDisplayArea, @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.dynabook.VDlauncher/1000 for top-activity {com.dynabook.VDlauncher/com.dynabook.VDlauncher.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/VDlauncher/MainActivity.java MainActivity::onCreate

相关推荐
_祝你今天愉快40 分钟前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl1 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
麦田里的守望者江1 小时前
KMP 中的 expect 和 actual 声明
android·ios·kotlin
Dnelic-2 小时前
解决 Android 单元测试 No tests found for given includes:
android·junit·单元测试·问题记录·自学笔记
佛系小嘟嘟2 小时前
Android Studio不显示需要的tag日志解决办法《All logs entries are hidden by the filter》
android·ide·android studio
mariokkm2 小时前
Django一分钟:django中收集关联对象关联数据的方法
android·django·sqlite
长亭外的少年2 小时前
如何查看 Android 项目的依赖结构树
android
深海呐4 小时前
Android 从本地选择视频,用APP播放或进行其他处理
android·音视频·从本地选择视频,用app播放·从本地选择视频,并拿到信息·跳转到本地视频列表
深海呐4 小时前
Android Google登录接入
android·google登录接入·android 谷歌登录接入·google登录·android google
daiyang123...5 小时前
MySQL【知识改变命运】11
android·数据库·mysql