当前位置:网站首页>Ams:startactivity desktop launch application

Ams:startactivity desktop launch application

2022-06-23 05:18:00 xhBruce

startActivity Desktop launch application

android12-security-release


Launcher Click the app icon

packages/apps/Launcher3/src/com/android/launcher3/touch/ItemClickHandler.java
packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
packages/apps/Launcher3/src/com/android/launcher3/BaseDraggingActivity.java

onClickAppShortcut -> startAppShortcutOrInfoActivity -> launcher.startActivitySafely -> startActivity() Finally called Activity.java in .

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Activity Start... In a new task stack

Activity.java

frameworks/base/core/java/android/app/Activity.java
frameworks/base/core/java/android/app/Instrumentation.java

startActivity() -> startActivityForResult -> mInstrumentation.execStartActivity -> ActivityTaskManager.getService().startActivity
 Insert picture description here  Insert picture description here

  • mParent The application starts for the first time, so mParent It's empty .
  • mMainThread.getApplicationThread() obtain ApplicationThread Member variables , It's a Binder object
  • ActivityTaskManager.getService() What you get is Context.ACTIVITY_TASK_SERVICE That is ActivityTaskManagerService
  • Instrumentation.java Used to monitor the interaction between applications and systems
  • checkStartActivityResult(result, intent); Check whether the startup is successful

ActivityTaskManagerService

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

ActivityTaskManager.getService().startActivity -> startActivityAsUser() -> getActivityStartController().obtainStarter ........ execute() -> executeRequest(mRequest) -> startActivityUnchecked() -> startActivityInner()
 Insert picture description here
 Insert picture description here
 Insert picture description here

  • obtainStarter obtain ActivityStarter
  • executeRequest(mRequest) Output here START u journal , Generally, customization will add pid Print
     Insert picture description here
  • ActivityRecord r,sourceRecord Information
  • startActivityInner() This method has a number of parameter handling , Such as setInitialState\computeLaunchingTaskFlags\computeSourceStack\mIntent.setFlags(mLaunchFlags)\computeLaunchParams
  • startActivityInner() here wm_create_taskwm_create_activity
     Insert picture description here
     Insert picture description here
  • mDoResume Move to top of stack display resumeFocusedTasksTopActivities
     Insert picture description here

Task / ActivityRecord

frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
frameworks/base/services/core/java/com/android/server/wm/Task.java
frameworks/base/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
frameworks/base/services/core/java/com/android/server/wm/ActivityRecord.java

mRootWindowContainer.resumeFocusedTasksTopActivities -> focusedRoot.resumeTopActivityUncheckedLocked -> resumeTopActivityInnerLocked -> First startPausingLocked after next.setState(RESUMED, "resumeTopActivityInnerLocked")

  • mResumedActivity != null First of all startPausingLocked() perform Pausing The process , And output the log wm_pause_activity
if (mResumedActivity != null) {
    
    ProtoLog.d(WM_DEBUG_STATES, "resumeTopActivityLocked: Pausing %s", mResumedActivity);
    pausing |= startPausingLocked(false /* uiSleeping */, next,
            "resumeTopActivityInnerLocked");
}
ProtoLog.v(WM_DEBUG_STATES, "Moving to PAUSING: %s", prev);

EventLogTags.writeWmPauseActivity(prev.mUserId, System.identityHashCode(prev),
        prev.shortComponentName, "userLeaving=" + userLeaving, reason);
  • next.setState(RESUMED, "resumeTopActivityInnerLocked"); Set up ActivityRecord Of RESUMED state , Finally through Task Call to ATMS in setResumedActivityUncheckLocked, And the output wm_set_resumed_activity
    void onActivityStateChanged(ActivityRecord record, ActivityState state, String reason) {
    
        warnForNonLeafTask("onActivityStateChanged");
        if (record == mResumedActivity && state != RESUMED) {
    
            setResumedActivity(null, reason + " - onActivityStateChanged");
        }

        if (state == RESUMED) {
    
            if (ActivityTaskManagerDebugConfig.DEBUG_ROOT_TASK) {
    
                Slog.v(TAG_ROOT_TASK, "set resumed activity to:" + record + " reason:" + reason);
            }
            setResumedActivity(record, reason + " - onActivityStateChanged");
            if (record == mRootWindowContainer.getTopResumedActivity()) {
    
                mAtmService.setResumedActivityUncheckLocked(record, reason);
            }
            mTaskSupervisor.mRecentTasks.add(record.getTask());
        }
    }
EventLogTags.writeWmSetResumedActivity(
        r == null ? -1 : r.mUserId,
        r == null ? "NULL" : r.shortComponentName,
        reason);
  • resumeTopActivityInnerLocked() Output here wm_resume_activity
EventLogTags.writeWmResumeActivity(next.mUserId, System.identityHashCode(next),
        next.getTask().mTaskId, next.shortComponentName);
  • mTaskSupervisor.startSpecificActivity Has been launched , perform realStartActivityLocked(); Execution is not started mService.startProcessAsync()

ActivityTaskSupervisor / ProcessList

frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
frameworks/base/services/core/java/com/android/server/am/ProcessList.java
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
Task.resumeTopActivityInnerLocked -> realStartActivityLocked / mService.startProcessAsync

void startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig) {
    
    // Is this activity's application already running?
    final WindowProcessController wpc =
            mService.getProcessController(r.processName, r.info.applicationInfo.uid);

    boolean knownToBeDead = false;
    if (wpc != null && wpc.hasThread()) {
    
        try {
    
            realStartActivityLocked(r, wpc, andResume, checkConfig);
            return;
        } catch (RemoteException e) {
    
            Slog.w(TAG, "Exception when starting activity "
                    + r.intent.getComponent().flattenToShortString(), e);
        }

        // If a dead object exception was thrown -- fall through to
        // restart the application.
        knownToBeDead = true;
    }

    r.notifyUnknownVisibilityLaunchedForKeyguardTransition();

    final boolean isTop = andResume && r.isTopRunningActivity();
    mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
}
  • perform realStartActivityLocked() Really start APP
  • startProcessAsync adopt ActivityManagerService Go to the ProcessList.java in startProcess() call Process.start, Final ZYGOTE_PROCESS.startfork Build process
  • startProcessAsync adopt ActivityManagerService Go to the ProcessList.java in handleProcessStartedLocked Output am_proc_start:
EventLog.writeEvent(EventLogTags.AM_PROC_START,
        UserHandle.getUserId(app.getStartUid()), pid, app.getStartUid(),
        app.processName, app.getHostingRecord().getType(),
        app.getHostingRecord().getName() != null ? app.getHostingRecord().getName() : "");

startProcess

frameworks/base/services/core/java/com/android/server/am/ProcessList.java
frameworks/base/core/java/android/os/Process.java
frameworks/base/core/java/android/os/ZygoteProcess.java
frameworks/base/core/java/android/app/ActivityThread.java
 Insert picture description here  Insert picture description here

  • Process.start Create a process for the application , Finally execute to ActivityThread.main() Method
  • openZygoteSocketIfNeeded Follow zygote Process establishes connection ZygoteConnection
synchronized(mLock) {
    
    // The USAP pool can not be used if the application will not use the systems graphics
    // driver. If that driver is requested use the Zygote application start path.
    return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),
                                      zygotePolicyFlags,
                                      argsForZygote);
}

To be continued ~~~ There is still a long way to go
 Insert picture description here


Log keyword :
ActivityTaskManager: START u|ActivityTaskManager: Displayed
wm_create_activity|wm_set_resumed_activity|wm_resume_activity|wm_on_resume_called|wm_activity_launch_time



Related articles :

Android Application startup process source code analysis
Android The application starts internally Activity The process (startActivity) Source code analysis of
startActivity Start process analysis
【 Android 10 Four components 】 series – Activity Of “ Start process ”
Android And Activity Start up process details ( be based on api28)

原网站

版权声明
本文为[xhBruce]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/174/202206230225033359.html