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

相关推荐
百锦再9 分钟前
Android Studio开发 SharedPreferences 详解
android·ide·android studio
青春给了狗21 分钟前
Android 14 修改侧滑手势动画效果
android
CYRUS STUDIO27 分钟前
Android APP 热修复原理
android·app·frida·hotfix·热修复
火柴就是我1 小时前
首次使用Android Studio时,http proxy,gradle问题解决
android
limingade2 小时前
手机打电话时电脑坐席同时收听对方说话并插入IVR预录声音片段
android·智能手机·电脑·蓝牙电话·电脑打电话
浩浩测试一下2 小时前
计算机网络中的DHCP是什么呀? 详情解答
android·网络·计算机网络·安全·web安全·网络安全·安全架构
青春给了狗3 小时前
Android 14 系统统一修改app启动时图标大小和圆角
android
pengyu4 小时前
【Flutter 状态管理 - 柒】 | InheritedWidget:藏在组件树里的"魔法"✨
android·flutter·dart
居然是阿宋5 小时前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin
凉、介6 小时前
PCI 总线学习笔记(五)
android·linux·笔记·学习·pcie·pci