2. Android 从桌面到Activity启动流程(2024精华版)

目录:

1. Android系统启动流程
2.4.init进程启动
3.Zygote进程启动
4.SystemServer进程启动
5.Launcher启动
6.Activty启动流程分析(热启动):

1. Android系统启动流程

前三步做热身, 后面4步启动不同的进程!

1).启动电源以及系统启动(Rom)

当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。

2).引导程序BootLoader

引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。

3).Linux内核启动(kernel)

内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置,它首先在系统文件中寻找init.rc文件,并启动init进程。

4).init进程启动

初始化和启动属性服务,并且启动Zygote进程。

5).Zygote进程启动

创建JavaVM并为JavaVM注册JNI,创建服务端Socket,启动SystemServer进程。

6).SystemServer进程启动

启动Binder线程池和SystemServiceManager,并且启动各种系统服务。

7).Launcher启动

被SystemServer进程启动的ActivityManagerService会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。

系统进程的启动顺序:

Init进程-->Zygote进程-->SystemServer进程-->应用进程(Launcher)

系统启动流程.jpg

2. init 进程总结

1).init进程创建: init是最早的进程,通过脚本拉起来

2).zygote/serviceManager, sufacefinger, mediaServcie创建: init创建了这些核心的服务

3). init 进程守护其他进程

3. Zygote进程总结:

1). inti创建Zygote进程, 创建AppRuntime(虚拟机)并调用其start方法,启动Zygote进程

2). (java层启动)通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。(ZygoteInit.java).换句换说Zygote开创了Java框架层

3). 预加载资源: openGl/android.jar

4). 先启动的systemServer: Zygote 进程 fork 创建systemServer()

4. 总结SyetemServer进程:

1.启动Binder线程池,这样就可以与其他进程进行通信。(通过java调用c启动的)

2.创建SystemServiceManager用于对系统的服务进行创建、启动和生命周期管理。

3.启动各种系统服务,AMS,PMS, WMS, watchDog, systemUI

————————————————

5. Launcher进程启动APP流程:

架构图.jpg

1、点击桌面App图标,Launcher进程采用Binder IPC向system_server(AMS)进程发起startActivity请求;(launcher----AMS)
2、system_server进程接收到请求后,向zygote进程发送创建进程的请求;(AMS------zygote)
3、Zygote进程fork出新的子进程,即App进程;(APP进程被创建, 注意:如果是子进程在不会重新创建,而是热启动)
4、App进程,通过Binder IPC向sytem_server(AMS)进程发起attachApplication请求;(Application)
5、system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
6、App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;(Activity)
7、主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法

8 .到此,App 便正式启动,开始进入Activity 生命周期,执行完onCreate/onStart/onResume 方法,UI 渲染结束后便可以看到App 的主界面

Activity的启动流程答案:

1、Launcher被调用点击事件,转到Instrumentation类的startActivity方法。 Instrumentation通过AIDL方式使用Binder机制告诉AMS要启动应用的需求。
2. AMS收到需求后,反馈Launcher,让Launcher进入Paused状态 .Launcher进入Paused状态,AMS通过socket与Zygote通信,告知Zygote需要新建进程。

  1. Zygote进程fork出新的子进程,即App进程;并调用ActivityThread的main方法,也就是app的入口。还会创建Binder 线程池(ProcessState.startThreadPool()

4、在上面创建了APP进程之后。然后通过反射,

5. system_server进程在收到请求后,进行一系列准备工作后, 进入到了 ActivityThread的main方法新建了ActivityThread实例,并新建了Looper实例,开始loop循环。

6、ActivityThread也告知AMS,进程创建完毕,开始创建Application,Provider,并调用Applicaiton的attach,onCreate方法。
7、Ams处理后,向APP进程发送scheduleLaunchActivity请求,于是乎,activity真正启动了。是scheduleLaunchActivity??????

8. 最后就是创建上下文,通过类加载器加载Activity,调用Activity的onCreate方法。

问题: 会有几次跨进程的动作?****绑定服务跨了几次进程?

看上面的图, 线条

6次。Launcher,AMS,Zygote,App进程是三个独立的进程,相互通信就需要使用进程间通信机制。与Zygote通信是使用的socket通信,Launcher,AMS,App进程间使用的是Binder机制。所以一共是6次跨进程,然后2次是socket。然后4次是binder机制

6. Activty启动流程分析(热启动):

ActivityThread的main函数入口:

开启主线程的消息循环: 系统在应用程序进程启动完成后,就会创建一个消息循环

启动模式的源码:ActivityStackSupervisor------>startActivityLocked();
startActivityForResult()
      Instrumentation----> execStartActivity()
              ActivityManagerNative---->startActivity()    
                    ActivityManagerService---->startActivity()
                           ActivityStarter------startActivityMayWait()
                                 ActivityStackSupervisor------>startActivity()
                                      ActivityStackSupervisor-->  resumeFocusedStackTopActivityLocked
                                             ActivityStackSupervisor--->realStartActivityLocked
                                                       ActivityThread--->scheduleLaunchActivity()---->通过handler发消息
                                                               ActivityThread---> handleLaunchActivity ---最终结果

1). Activity启动是通过startActivity方法进行的

2).Instrumentation: 最后会通过Instrumentation对象调用execStartActivity方法,Instrumentation用来管理applicaiton及Activity的生命周期。Instrumentation最终通过binder通信将信息给到AMS

3). ActivityRecord: 初始化一个ActivityRecord对象实例,它可以说是一个Activity,存储了Activity的所有信息

4). Activity启动栈:之后如果有需要还会创建一个TaskRecord(任务栈),加入到ActivityStack(Activity栈),之后将ActivityRecord加入到TaskRecord栈顶位置

简单的总结:

AMS---->ActivityStackSupervisor---->ActivityStack------->TaskRecord()------>ActivityRecord()

1). Instrumentation通过Binder与AMS通信,知道了要启动哪个页面,

2). 之后AMS又通过binder将启动的操作交给ActivityThread,之后执行scheduleTransaction方法,通过mH(Handler)来切换线程,

3). 最终执行handleLaunchActivity方法去启动Activity。

4). 真正启动方法是:performLaunchActivity方法,通过ActivityClientRecord获取ActivityInfo对象,实例话具体的Activity实例、ContextImpl实例等等,之后执行生命周期的一些方法。

调用时序图:

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

推荐阅读更多精彩内容