当前位置:网站首页>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

mParentThe application starts for the first time, so mParent It's empty .mMainThread.getApplicationThread()obtain ApplicationThread Member variables , It's a Binder objectActivityTaskManager.getService()What you get isContext.ACTIVITY_TASK_SERVICEThat is ActivityTaskManagerServiceInstrumentation.javaUsed to monitor the interaction between applications and systemscheckStartActivityResult(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()


obtainStarterobtain ActivityStarterexecuteRequest(mRequest)Output hereSTART ujournal , Generally, customization will addpidPrint
ActivityRecord r,sourceRecordInformationstartActivityInner()This method has a number of parameter handling , Such assetInitialState\computeLaunchingTaskFlags\computeSourceStack\mIntent.setFlags(mLaunchFlags)\computeLaunchParamsstartActivityInner()herewm_create_task、wm_create_activity

mDoResumeMove to top of stack displayresumeFocusedTasksTopActivities
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 != nullFirst of allstartPausingLocked()perform Pausing The process , And output the logwm_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 insetResumedActivityUncheckLocked, And the outputwm_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 herewm_resume_activity
EventLogTags.writeWmResumeActivity(next.mUserId, System.identityHashCode(next),
next.getTask().mTaskId, next.shortComponentName);
mTaskSupervisor.startSpecificActivityHas been launched , performrealStartActivityLocked(); Execution is not startedmService.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.javaTask.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()callProcess.start, Final ZYGOTE_PROCESS.startforkBuild process - startProcessAsync adopt ActivityManagerService Go to the ProcessList.java in
handleProcessStartedLockedOutputam_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

Process.startCreate a process for the application , Finally execute toActivityThread.main()MethodopenZygoteSocketIfNeededFollow 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 
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)
边栏推荐
猜你喜欢

入行软件测试5年,跳槽3次,我摸透了软件测试这一行

Three tier architecture experiment

C'est dur de trouver un emploi? Ali des trois côtés, heureusement qu'il s'est bien préparé et qu'il a pris un produit.

当SBAS遇上rtklib

Official download and installation of QT and QT vs tools plug-ins

PRCS-1016 : Failed to resolve Single Client Access Name

JSP入门级笔记

Servlet self study notes

VMware network connection error unit network service not found

Hcip switch experiment
随机推荐
BGP summary of hcip operation
Strong push, quick start to software testing
HCIP 作业 BGP总结
GNSS速度解算的三种方法
TIOBE 编程语言排行榜是编程语言流行趋势的一个指标
强推,软件测试快速入门,一看就会
MySQL stored procedure
8 years' experience: monthly salary of 3000 to 30000, the change of Test Engineer
When SBAS encounters rtklib
The propeller framework v2.3 releases the highly reusable operator library Phi! Restructure development paradigm to reduce cost and increase efficiency
MVC三层架构
Visual display of TEQC quality analysis results using teqcplot
Open source ecology 𞓜 super practical open source license basic knowledge literacy post (Part 2)
基金业绩评价
Architecture à trois niveaux MVC
Difficult to find a job in a bad environment? Ali on three sides. Fortunately, he has made full preparations and has offered
微信小程序;AI智能配音助手
mongodb分片原理
In unity, how to read and write a scriptableobject object in editor and runtime
laravel8实现图片验证码