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 resumed0 = 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

相关推荐
半摆烂日常4 小时前
低代码平台API对接实践:接口鉴权与数据同步的完整实现
android·低代码·rxjava
事圆则缓4 小时前
volatile 使用场景全解析:它能保证什么,又解决不了什么
android
蒲公英内测分发5 小时前
智能投影仪参加海外展会,未上架的 Android 配套 App 怎么让客户限时试用?
android
ii_best5 小时前
按键精灵手机端开发安卓版实战:手写一个可最小化、可拖动的「运行日志悬浮窗」(附完整 源码 + 踩坑记录)
android·ios·智能手机·自动化·ai编程·按键精灵
终端安全笔记5 小时前
安卓做 MDM 管控,先分清三种注册入口
android·安全·智能手机
乌萨达6 小时前
手机模拟器安卓怎么用?电脑安装应用、玩手游与账号同步指南
android·智能手机·电脑·雷电模拟器
美狐美颜SDK开放平台7 小时前
Android与iOS直播APP美颜有什么区别?视频美颜SDK开发详解
android·ios·音视频·视频美颜sdk
春猿火9 小时前
某市-2026【网安·论道】misc-afterimage_note-wp
android
恋猫de小郭10 小时前
Shopify 回应为什么从 RN 回到原生,为什么不用 KMP ?
android·前端·flutter
fundroid11 小时前
Android AI 开发,真正拉开差距的是工程闭环
android·ai·大模型·agent