当前位置:网站首页>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)
边栏推荐
猜你喜欢

直接插入排序——【常见排序法(1/8)】

Emergency response HW review

图片降噪DeNoise AI

【微服务|Nacos】Nacos版本相关问题一览

开源生态|超实用开源License基础知识扫盲帖(下)

Introduction to s file generated by TEQC for GNSS data quality analysis

MVC three-tier architecture

PRCS-1016 : Failed to resolve Single Client Access Name

精密星历介绍与使用

I have been engaged in software testing for 5 years and have changed jobs for 3 times. I have understood the field of software testing
随机推荐
PRCS-1016 : Failed to resolve Single Client Access Name
使用PX4的ECL进行多传感器数据融合的后处理
Post processing of multisensor data fusion using Px4 ECL
Swiftui 2.0 course notes Chapter 5
新晋职场人的 技术进击?之旅
MySQl基础
【C语言】关键字
投资风险管理
985 test engineer is hanged. Who is more important in terms of education and experience?
AMS:startActivity桌面启动应用
Complete the primary school project in 3 days, and teach you to complete the weather broadcast system hand in hand!
渗透测试基础 | 附带测试点、测试场景
滑块视图的实现
A bug in rtklib2.4.3 B34 single point positioning
计算欧式距离和余弦相似度
8年经验之谈:月薪3000到30000,测试工程师的变“行”记
JDBC调用存储过程、MySQL触发器
How can functional testers spend one month to become advanced automation software test engineers
HCIP第五次作业
SwiftUI 2.0 课程笔记 Chapter 5