当前位置: 首页 > news >正文

aosp15 - App冷启动

在这里插入图片描述

纸上得来终觉浅,绝知此事要躬行。 —— [宋]陆游

基于aosp_cf_x86_64_phone-trunk_staging-eng , 下面是具体断点位置。

第一部分,桌面launcher进程

com.android.launcher3.touch.ItemClickHandler

  • onClick
  • onClickAppShortcut
  • startAppShortcutOrInfoActivity

com.android.launcher3.Launcher

  • startActivitySafely

com.android.launcher3.uioverrides.QuickstepLauncher

  • startActivitySafely

com.android.launcher3.views.ActivityContext

  • startActivitySafely

这里给Intent增加了FLAG_ACTIVITY_NEW_TASK标记
safely也許是指用了try-catch,保证在UI线程执行,处理空指针,Activity_not_found,SecurityException等等

// 当前Intent的信息
Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 
pkg=com.android.gallery3d cmp=com.android.gallery3d/.app.GalleryActivity bnds=[188,775][360,1010] }

android.app.Activity

  • startActivity(android.content.Intent, android.os.Bundle)

com.android.launcher3.uioverrides.QuickstepLauncher

  • startActivityForResult

com.android.launcher3.Launcher

  • startActivityForResult

android.app.Activity

  • startActivityForResult(android.content.Intent, int, android.os.Bundle)

如果requestCode 是负数,没有result返回
如果启动模式是FLAG_ACTIVITY_NEW_TASK,得到一个cancel result
注意,在onCreate中调用,屏幕会闪烁,会等待result的返回

android.app.Instrumentation

  • execStartActivity

Instrumenttation 监控系统和应用程序交互

至此,Intent已经组装,判断正常


第二部分,系统服务进程

com.android.server.wm.ActivityTaskManagerService

  • startActivity
  • startActivityAsUser
  • startActivityAsUser // 初始化了ActivityStarter

startActivityAsUser

  1. 启动Activity的进程PID和PackageName是一致的
  2. 0号进程启动的
  3. SYSTEM_UID(1000)进程启动的,如果开发系统应用,指定android:sharedUserId=“android.uid.system”,使用系统签名
  4. 不是以上三种情况,抛出安全异常-SecurityException
  5. Android系统为新安装的应用分配UID,范围[10000, 19999]
  6. 多用户之后,UID = userid * 10000 + appid

扩展
0号进程:swapper进程,又称idle进程,系统初始化过程中,kernel从无到有开创的第一个进程,用于初始化进程管理,内存管理,加载binder driver,display,camera driver等
1号进程:init进程
2号进程:Kthread进程,所有内核进程的鼻祖

return getActivityStartController().obtainStarter(intent, "startActivityAsUser").setCaller(caller)   // IApplicationThread.setCallingPackage(callingPackage) // com.android.launcher3.setCallingFeatureId(callingFeatureId) // null.setResolvedType(resolvedType) // null.setResultTo(resultTo) //  Token{9fa6e8e ActivityRecord{a50b853 u0 com.android.launcher3/.uioverrides.QuickstepLauncher t8}}.setResultWho(resultWho) // null.setRequestCode(requestCode) // -1.setStartFlags(startFlags) // 0.setProfilerInfo(profilerInfo) // null.setActivityOptions(opts) // null .setUserId(userId).execute();

com.android.server.wm.ActivityStarter

  • execute
  • executeRequest // 执行request,根据request组装ActivityRecord【An entry in the history task, representing an activity.】
ActivityTaskSupervisor#resolveActivity(Intent, ResolveInfo, int, ProfilerInfo)  // -- 准备ActivityInfo
内含进程名字,目标Activity路径:
processName: com.android.gallery3d
name: com.android.gallery3d.app.GalleryActivity

com.android.server.wm.ActivityStarter.Request 包含:调用者进程,调用原因,Intent信息,目标ActivityInfo
ActivityStarter调用ActivityTaskSupervisor的resolveIntent得到ResolveInfo,该对象和Manifest中的intent对应
ActivityStarter调用ActivityTaskSupervisor的resolveActivity得到ActivityInfo,该对象和manifest.xml中的<activity>, <service> 标签对应

  • startActivityUnchecked
  • startActivityInner

com.android.server.wm.Task

  • startActivityLocked // 准备切换动画,此处WMS,showStartingWindow

com.android.server.wm.StartingSurfaceController

  • showStartingWindow

com.android.server.wm.ActivityRecord

  • showStartingWindow

com.android.server.wm.RootWindowContainer

  • resumeFocusedTasksTopActivities

com.android.server.wm.Task

  • resumeTopActivityUncheckedLocked
  • resumeTopActivityInnerLocked

com.android.server.wm.TaskFragment

  • resumeTopActivity

com.android.server.wm.ActivityTaskManagerService

  • startProcessAsync // 提前异步启动进程,节省等待当前Activity-Pause的时间

com.android.server.am.ActivityManagerService.LocalService

  • startProcess
    com.android.server.am.ActivityManagerService
  • startProcessLocked

ProcessList$startProcessLocked 生成一个ProcessRecord // 携带目标进程的信息

com.android.server.am.ProcessList

  • startProcessLocked // 新进程的入口:final String entryPoint = “android.app.ActivityThread”;

com.android.server.am.ProcessList

  • startProcessLocked // 要么返回新的PID ,要么抛出运行时异常

com.android.server.am.ProcessList

  • startProcess // 创建AppZygote,appZygote.getProcess().start

android.os.Process

  • start

android.os.ZygoteProcess

  • start
  • startViaZygote
  • zygoteSendArgsAndGetResult
  • attemptZygoteSendArgsAndGetResult // 生成ProcessStartResult

android.app.ActivityThread

  • main
  • attach

com.android.server.am.ActivityManagerService

  • attachApplication // 目标进程已启动
  • attachApplicationLocked
  • finishAttachApplicationInner

// — ActivityThread
android.app.ActivityThread.ApplicationThread

  • bindApplication // 组装一个AppBindData

android.app.ActivityThread.H

  • handleMessage

android.app.ActivityThread

  • handleBindApplication

android.app.Instrumentation

  • callApplicationOnCreate
    // — ActivityThread

com.android.server.wm.ActivityTaskManagerService.LocalService

  • attachApplication

com.android.server.wm.RootWindowContainer

  • attachApplication // —> 注:在deubg这里,可以attach到目标进程

com.android.server.wm.ActivityTaskSupervisor // LaunchActivityItem

  • realStartActivityLocked

注意:
com.android.server.wm.ClientLifecycleManager

  • scheduleTransactionAndLifecycleItems(
    IApplicationThread, // --> IApplicationThread S t u b Stub StubProxy
    servertransaction.ClientTransactionItem, // LaunchActivityItem
    ActivityLifecycleItem, // ResumeActivityItem
    boolean
    )
    此处,给LauncheActivityItem安排的下一个生命周期是ResumenctivityItem,和onCreate() - onStart() - onResume(), 不一致,onStart()从哪里加入的?请看下面,TranslationExecutor$executeLifecycleItem函数。

com.android.server.wm.ClientLifecycleManager

  • scheduleTransactionAndLifecycleItems
  • scheduleTransaction

android.app.servertransaction.ClientTransaction

  • schedule

第三部分,目标应用进程

android.app.ActivityThread.ApplicationThread

  • scheduleTransaction

android.app.ClientTransactionHandler // ActivityThread的父类,此时,ActivityThread已经启动了

  • scheduleTransaction

android.app.ActivityThread.H

  • handleMessage // EXECUTE_TRANSACTION

android.app.servertransaction.TransactionExecutor

  • execute
  • executeLifecycleState
  • executeLifecycleItem // 关键代码: cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */, transaction);

注意跟踪cycleToPath方法; 发现在performLifecycleSequence方法,是切换lifecycle的方法,在执行当前生命周期(ResumeActivityItem)转换之前,执行了onStart()

android.app.servertransaction.ActivityTransactionItem

  • execute(android.app.ClientTransactionHandler, android.app.servertransaction.PendingTransactionActions)

android.app.servertransaction.LaunchActivityItem //ActivityClientRecord

  • execute

android.app.ActivityThread

  • handleLaunchActivity // 这里已经触发了ON_CREATE

android.app.ActivityThread

  • performLaunchActivity

android.app.Instrumentation

  • newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent)

android.app.Activity

  • attach // 此时出现PhoneWindow 窗口

android.app.Instrumentation

  • callActivityOnCreate(android.app.Activity, android.os.Bundle)

android.app.Activity

  • performCreate(android.os.Bundle)
  • onCreate(android.os.Bundle)

还有一点:
回到ActivityThread H 的 E X E C U T E T R A N S A C T I O N 里,同时在 T r a n s a c t i o n E x e c u t o r H的EXECUTE_TRANSACTION里,同时在TransactionExecutor HEXECUTETRANSACTION里,同时在TransactionExecutorexecuteLifecycleItem里,deubg可以看到,LaunchActivityItem的下一个状态是ResumeActivityItem,在执行Resumectivitytem之前,执行了ON_START. 详情见:单步调试Android Framework——Activity生命周期切换

这样,onStart,onResume都触发了,App和首页Mainctivity 启动完毕,等待交互。

时序图

在这里插入图片描述


http://www.mrgr.cn/news/80928.html

相关文章:

  • 重拾设计模式--外观模式
  • GMSSL的不同python版本
  • 猫咪睡眠:萌态背后的奥秘与启示
  • 软考教材重点内容 信息安全工程师 第 10 章 入侵检测技术原理与应用
  • 【vue】npm install 报错 python2 Error: not found: python2
  • 面试题整理9----谈谈对k8s的理解2
  • 编译原理复习---基本概念+推导树
  • 云计算HCIP-OpenStack01
  • 滴滴的logicFlow流程图组件
  • 通过smem 定时检测系统内存占用情况
  • uniapp Native.js 调用安卓arr原生service
  • Ubuntu 上传项目到 GitHub
  • windwos defender实现白名单效果(除了指定应用或端口其它一律禁止)禁止服务器上网
  • 我在广州学 Mysql 系列——有关 Mysql 函数的练习
  • Mysql语法之DQL查询的多行函数
  • Linux文件属性 -- 查看文件命令
  • jvm符号引用和直接引用
  • 操作系统如何管理进程所用的资源
  • 编译原理复习---正则表达式+有穷自动机
  • 机器学习探索之旅:开启智能预测的新篇章!!! 笔记 ! ! !)
  • UE5 移植Editor或Developer模块到Runtime
  • *【每日一题 基础题】 [蓝桥杯 2024 省 B] 好数
  • FFmpeg库之ffplay
  • 2024.2 ACM Explainability for Large Language Models: A Survey
  • 计算机组成原理的学习笔记(2)--数据表示与运算·其二 逻辑门和加减乘
  • 细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV