Android Framework启动过程(android内核剖析笔记)

Posted android_xiaogang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Framework启动过程(android内核剖析笔记)相关的知识,希望对你有一定的参考价值。

Framework运行环境综述

1、android整体架构:


Framework定义客户端和服务端的组件和接口:主要包括三个部分

1、 服务端 分别是WindowManagerService(Wms),ActivityManageService(Ams)其中Ams管理所有应用程序中的Activity
2、 客户端
ActivityThread类,Activity类,PhoneWindwo类,Window类,DecorView类,ViewRoot类等
3、Linux驱动


2、Activity之间如何传递数据

所谓传递数据或者消息,一般指的是在多个线程之间,而Activity本身并不是线程。ActivityThread才是一个java类,它与线程之间没有关系,就好像我们定义一个苹果类,橘子类一样。

  • 方法1:可以先实例化某一个类,获得该类的引用,使用时通过引用去访问类的内部数据。
  • 方法2:对于A,B之间可以先实例化C,然后A,B把需要传递的数据存入到C,然后从C中取出。

Activity类的实例化是由Framework完成的,我们只使用startActivity方法告诉Framework去运行哪个Activity,这意味着我们得不到Activity的引用,那么就不能直接访问对象的内部数据。解决办法是使用
Activity,getApplication()方法,该方法返回一个Application对象,该Application对象在该程序中是唯一的,所有程序中的不同Activity返回的Application对象是相同的,对象的名称可以在AndroidMainfest_xml文件中指定,一旦获取到Application对象,就可以借助该对象在不同的Activity中传递数据。

除此之外,Framework本身也提供了标准的Activity之间传递数据的方法,Intent该类做为startactivity()中的一个参数。用于在启动Activity时传递给目标Activity。

3、一个Activity的启动过程(从linux内核到Framework层)


1、最底层的是内核,内核将读取init.rc文件,并启动该文件中定义的各种服务。

2、系统中运行的第一个Dalvik虚拟机程序叫做zygote。英文是“卵”的意思,接下来所有的Dalvik虚拟机进程都是通过这个“卵”孵化出来的。

3、然后到Dalvik VM。当java程序运行时,都是由java虚拟机来解释java的字节码。它将这些字节码翻译成本地CPU的指令码。Dalvik VM其实和这一样。Dalvik VM的作用就 是创建一个虚拟机并执行参数中指定的java类。

4、SystemServer进程的启动。SystemServer是zygote启动的第一个进程。这个进程在Android的运行环境中扮演了“中枢神经”的作用。APK应用中能够直接交互的大部分系统服务都在该进程中运行。

5、启动各种系统服务和线程。SystemServer启动后,常见的像WindowManagerServer(Wms),ActivityManagerService(Ams),PackageManagerServer(Pms)等,这些系统服务都以一个线程的方式存在于SystemServer进程中。

6、启动第一个Activity。当以上线程都启动后,其实Asm将调用

mMainStack.resumeTopActivityLocked(null)

由于系统刚刚启动,mMainStack中没有任何Activity对象,因此调用
startHomeLocked()函数。从这样看来,开机后系统从哪个 Activity开始执行完全取决于mMainStack中的第一个Activity的对象。
在Ams的startHomeActivityLocked()中,系统发出一个catagory的字段CATEGORY_HOME的Intent

intent.setComponent(mTopComponent)
if(mFactoryTest!=SystemServer.FACTORY_Test_LOW_LEVEL)
      intent.addCategory(Intent.CATEGORY_HOME)

无论哪个应用程序,只要声明自己能够响应的intent,那么就可以认为是Home程序。这是是android中为什么会存在各种所谓的“Home程序”的原因,系统并没有给任何程序赋予“Home”特权,而把这个特权交给用户。
这就是第一个Activity的启动过程。

以上是关于Android Framework启动过程(android内核剖析笔记)的主要内容,如果未能解决你的问题,请参考以下文章

Android Framework启动过程(android内核剖析笔记)

Android Framework——AMS、PMS的启动流程

framework之Activity启动流程(基于Android11源码)

framework之Activity启动流程(基于Android11源码)

framework之Activity启动流程(基于Android11源码)

Android Framework学习视频-BootAnimation开机动画启动流程源码分析