androidframework08-10-ams

时间:2021-7-5 作者:qvyue

学习笔记,整理中;需要再看n遍。

面:


自己思路整理:

1、android启动流程

  1. boot rom
  2. boot loader
  3. kernal
  4. init(pid=1) :
  • 创建和挂载系统所需要的文件和目录: framework的资源;
  • 初始化和启动属性服务
  • 解析init.rc 配置文件并启动zygote进程: 解析init.rc 创建各种服务进程
  1. zygote(android runtime) :
    • fork -> app进程
    • 一个进程所需要的必要资源
    • preloadclass
    • vm
    • fork 大儿子 system_server进程
  2. system service
  3. apps

2、zygote启动流程

init.cpp(main) > 解析init.zygote.rc > 启动main类型服务(do_class_start) > 启动zygote服务(start()) > 创建zygote进程(fork()) > app_main.cpp(main())

3、AMS启动过程

(1) system server启动

  1. SystemServer.main初始化SystemServer对象,再调用对象的run()方法;

  2. SystemServer.run:

    • CreateSystemContext;

    • startBootStrapService 启动引导服务;

    • startCoreService 启动核心服务;

    • startOtherService 启动其他服务,80多个;

    • Looper.loop()进入loop循环

(2)AMS启动过程 startBootstrapServices

  1. mSystemServiceManager.startService
    • 经过一堆 startService –> 创建Lifecycle对象 –> 创建AMS:创建”android.ui”的线程、创建ActiveServices、创建ActivityStackSupervisor对象
    • 通过LifeCycle的getService返回AMS对象
  2. mSystemServiceManager.setInstaller 设置AMS的安装器
  3. mSystemServiceManager.initPowerManagement 初始化AMS相关的PMS
  4. mSystemServiceManager.setSystemProcess 设置SystemServer
    • 添加了各种服务:activity AMS;procstats 进程统计;meninfo 进程统计;gfxinfo 图像信息;dbinfo 数据库;cpuinfo cpu;permision 权限;processinfo 进程服务;useagestats 应用的使用情况。

    • abd shell dumsys 的各种服务来源 暂不懂

    • mSystemThread.installSystemApplicationInfo:

      • getSystemContext().installSystemApplicationInfo 最终调用LoadedApk的installSystemApplicationInfo,加载名为“android”的package
      • 创建用于性能统计的Profiler对象
    • 创建ProcessRecord对象

(3)AMS启动过程 startOtherServices

  1. mActivityManagerService.setWindowManager(wm) 与WMS管理
  2. mActivityManagerService.installSystemProviders
    • 安装系统Provider
    • 创建核心Settings Observer,用于监控Settings的改变
  3. mActivityManagerService.systemReady
    • startSystemUi 启动系统UI
    • 执行一系列服务的systemReady
    • startHomeActivityLocked

(4)system_server进程

  1. SystemServer.run–>createSystemContext–>

    • ActivityThread.systemMain

      • new ActivityThread

        • 创建ApplicationThread对象
        • mInitialApplication的赋值
          • system_server进程是由ActivityThread.attach()过程赋值
          • 普通app进程是由是由ActivityThread.handleBindApplication()过程赋值
        • ResourcesManager.getInstance() 获取资料管理实例
      • thread.attach(true) //attach到进程

        • 创建Instrumentation
        • ContextImpl.createAppContext–> activityThread.getSystemContext–>ContextImpl.createSystemContext 单例模式创建mSystemContext对象
          – – – – > 创建LoadedApk对象:创建ApplicationInfo对象、创建ClassLoader
          – – – – > 创建ContextImpl:首次执行getSystemContext,会创建LoadedApk和contextImpl对象,接下来利用刚创建的LoadedApk对象来创建新的ContextImpl对象
        • makeApplication
          –> initializeJavaContextClassLoader 设置当前线程的Context ClassLoader
          –> newApplication
          – – – – > instantiateApplication 创建Application对象
          – – – – > 将新创建的ContextImpl对象保存到Application的父类成员变量mBase
          – – – – >将新创建的LoadedApk对象保存到Application的父员变量mLoadedApk
        • mInitialApplication.onCreate()
      • 返回systemMain线程

    • mSystemContext.setTheme 设置系统主题

  2. SystemServer.run–>开始启动各种服务

(5) App进程启动过程

ActivityThread.main 当Zygote收到AMS请求创建一个新app进程后,会调用到AT.main

  • new ActivityThread
  • mAppThread = new ApplicationThread() :class ApplicationThread extends IApplicationThread.Stub
  • AT.attach — attachApplication binder通信权限验证 这里来到AMS – – attachApplicationLocked – – thread.bindApplication 这是一个binder通信过程 这里来到App
    • 创建一个AppBindData
    • sendMessage(H.BIND_APPLICATION, data)–>handleBindApplication
    • 创建一个Instrumentation
    • data.info = getPackageInfoNoCheck 获取LoadedApk对象–>getPackageInfo
    • ContextImpl.createAppContext 创建ContextImpl上下文
    • data.info.makeApplication 通过反射创建目标应用Application对象
      ——> 创建ClassLoader对象
      ——> ContextImpl.createAppContext
      ——> mActivityThread.mInstrumentation.newApplicatio 创建Application对象– newApplication–attach — attachBaseContext Application的mBase
    • mInstrumentation.callApplicationOnCreate–>app.onCreate 常见的application的oncreate就是这里调用的

(6) Activity.startActivity

–> startActivityForResult–> Instrumentation.execStartActivity –> AMS.startActivity –> AMS.startActivityAsUser –> mActivityStartController.obtainStarter.execute 这里会调用到ActivityStarter的execute方法 –> ActivityStarter.startActivity 这里有多重调用 –> ActivityStarter.startActivityUnchecked–>

  • 根据启动标志位和Activity启动模式来决定如何启动一个Activity以及是否要调用deliverNewIntent方法通知Activity有一个Intent试图重新启动它
  • ASS.resumeFocusedStackTopActivityLocked — ASS.resumeTopActivityUncheckedLocked — ASS.resumeTopActivityInnerLocked — ASS.startSpecificActivityLocked

    –> ASS.realStartActivityLocked
    –> AMS.startProcessLocked 进程还没创建 — AMS.startProcess — Process.start–zygoteProcess.start — zygoteProcess.startViaZygote:zygoteSendArgsAndGetResult 、openZygoteSocketIfNeeded


4、activity启动(APP到AMS再到APP 用binder来处理,app会处理binderproxy给AMS)

APP
  1. execStartActivity
  • ActivityThread(主线程)
    Activity1–>instrumentation
  1. startActivity
  • ActivityManagerProxy
  1. startActivity:跨进程的binder调用
AMS

ActivityManagerService

  1. startActivityMayWait
  • ActivityStackSupervisor
  1. 处理Activity栈
  • ActivityStack–>ActivityRecord
  1. scheduleLaunchActivity
  • ApplicationThreadProxy
  1. scheduleLaunchActivity:跨进程的binder调用
APP
  1. handleMessage
  • ApplicationThread
    Handler–>CallBack
  1. handleLaunchActivity
  2. newActivity
  • ActivityThread(主线程)
    Instrumentation–>ClassLoader
  1. onCreate
  • ActivityThread(主线程)
    Activity2

5、 应用程序启动(借图)

  1. Launcher进程
    请求启动根Activity
  2. AMS
    请求创建应用程序进程:socket
  3. Zygote进程
    创建并启动应用程序进程
  4. 应用程序进程
    应用程序进程准备就绪–>到达AMS–>启动根Activity–>到达应用程序进程

摘要:


内容:

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。