当前位置:网站首页>AMS:startActivity桌面启动应用
AMS:startActivity桌面启动应用
2022-06-23 03:55:00 【xhBruce】
startActivity桌面启动应用
android12-security-release
Launcher点击应用图标
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()最后调用到Activity.java中。
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Activity在新的任务栈中启动
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

mParent应用首次启动所以mParent为空。mMainThread.getApplicationThread()获取ApplicationThread成员变量,是一个Binder对象ActivityTaskManager.getService()获取的是Context.ACTIVITY_TASK_SERVICE即是 ActivityTaskManagerServiceInstrumentation.java用来监控应用程序和系统的交互checkStartActivityResult(result, intent);检查是否启动成功
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()


obtainStarter获取ActivityStarterexecuteRequest(mRequest)这里输出START u日志,一般定制都会加上pid打印
ActivityRecord r,sourceRecord信息startActivityInner()该方法有许多参数处理,如setInitialState\computeLaunchingTaskFlags\computeSourceStack\mIntent.setFlags(mLaunchFlags)\computeLaunchParamsstartActivityInner()这里wm_create_task、wm_create_activity

mDoResume移到栈顶显示resumeFocusedTasksTopActivities
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 -> 先startPausingLocked后next.setState(RESUMED, "resumeTopActivityInnerLocked")
mResumedActivity != null时先startPausingLocked()执行Pausing过程,并输出日志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");设置ActivityRecord的RESUMED状态,最终通过Task调用到ATMS中setResumedActivityUncheckLocked,并输出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()这里输出wm_resume_activity
EventLogTags.writeWmResumeActivity(next.mUserId, System.identityHashCode(next),
next.getTask().mTaskId, next.shortComponentName);
mTaskSupervisor.startSpecificActivity已经启动,执行realStartActivityLocked();没有启动执行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.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");
}
- 执行
realStartActivityLocked()真正启动APP - startProcessAsync通过ActivityManagerService走到ProcessList.java中
startProcess()调用Process.start,最终ZYGOTE_PROCESS.startfork生成进程 - startProcessAsync通过ActivityManagerService走到ProcessList.java中
handleProcessStartedLocked输出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

Process.start为应用创建进程,最后执行到ActivityThread.main()方法openZygoteSocketIfNeeded跟zygote进程建立连接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);
}
待续~~~ 后面还有很长一段路程
Log关键字:
ActivityTaskManager: START u|ActivityTaskManager: Displayed
wm_create_activity|wm_set_resumed_activity|wm_resume_activity|wm_on_resume_called|wm_activity_launch_time
相关文章:
Android应用程序启动过程源代码分析
Android应用程序内部启动Activity过程(startActivity)的源代码分析
startActivity启动过程分析
【 Android 10 四大组件 】系列 – Activity 的“启动流程”
Android之Activity启动流程详解(基于api28)
边栏推荐
- BGP summary of hcip operation
- JDBC call stored procedure, MySQL trigger
- 【毕业季_进击的技术er】送别过去两年迷茫的自己。重整旗鼓,大三我来啦
- 代码片段管理器SnippetsLab
- The propeller framework v2.3 releases the highly reusable operator library Phi! Restructure development paradigm to reduce cost and increase efficiency
- In unity, how to read and write a scriptableobject object in editor and runtime
- 精密星历介绍与使用
- 同步国内AOSP代码相关错误
- Separate use of alertmanager alarms and use of Prometheus configuration alarm rules
- Cookie-Session讲解
猜你喜欢
随机推荐
Separate use of alertmanager alarms and use of Prometheus configuration alarm rules
Dolphin scheduler 2.0.5 spark task test summary (source code optimization)
微信小程序:全新趣味测试
使用PX4的ECL进行多传感器数据融合的后处理
rtklib2.4.3 b34 单点定位的一个bug
A compiler related bug in rtklib2.4.3 B34
微信小程序:爱情保证书制作生成
轮播图的实现
掌握 Shell,一篇就够了!
MMDeploy快速安装及使用说明
Servlet self study notes
【C语言】关键字
Strong push, quick start to software testing
Function declaration and call of 17 generator
[MAC] there is no source option in security and privacy
Parameter passing of 18 generator function
Jetpack Compose 从开门到入门之 MenuBar桌面菜单(Desktop Menu)
微信小程序:土味情话恋爱话术
微信小程序;AI智能配音助手
百度飞桨“万有引力”2022首站落地苏州,全面启动中小企业赋能计划
![Direct insertion sort - [common sort method (1/8)]](/img/c3/f08d789c9ff32dda4f20c58e7c114d.png)








