androidframework08-10-ams

学习笔记,整理中;需要再看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-->到达应用程序进程

摘要:


内容:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容