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 启动完毕,等待交互。

时序图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值