`

Android Framework内核之旅

 
阅读更多

Framework框架

Framework 定义了客户端 组件和服务端组件功能及接口。以下阐述中,“应用程序”一般是指“ .apk ”程序。

框架中包含三个主要部分,分别为服务端、客户端和 Linux 驱动。

6.1.1
服务端

服务端主要包含两个重要类,分别是 WindowManagerService WmS )和 ActivityManagerService
(AmS)
WmS 的作用是为所有的应用程序分配窗口,并管理这些窗口。包括分配窗口的大小,调节各窗口的叠放次序,隐藏或者显示窗口。 AmS 的作用是管理所有应用程序中的 Activity

除此之外,在服务端还包括两个消息处理类。

—
KeyQ 类:该类为 WmS 的内部类,继承于 KeyInputQueue 类, KeyQ 对象一旦创建,就立即启动一个线程,该线程会不断地读取用户的 UI 操作消息,比如按键、触摸屏、 trackball 、鼠标等,并把这些消息放到一个消息队列 QueueEvent 类中。

—
InputDispatcherThread 类:该类的对象一旦创建,也会立即启动一个线程,该线程会不断地从 QueueEvent 中取出用户消息,并进行一定的过滤,过滤后,再将这些消息发送给当前活动的客户端程序中。

6.1.2
客户端

客户端主要包括以下重要类。

—
ActivityThread 类:该类为应用程序的主线程类,所有的 APK 程序都有且仅有一个 ActivityThread 类,程序的入口为该类中的 static main() 函数。

—
Activity 类:该类为 APK 程序的一个最小运行单元,一个 APK 程序中可以包含 Activity 对象, ActivityThread 主类会根据用户操作选择运行哪个 Activity 对象。

—
PhoneWindow 类:该类继承于 Window 类,同时, PhoneWindow 类内部包含了一个 DecorView 对象。简而言之, PhoneWindow 是把一个 FrameLayout 进行了一定的包装,并提供了一组通用的窗口操作接口。

—
Window 类:该类提供了一组通用的窗口( Window )操作 API ,这里的窗口仅仅是程序层面上的, WmS 所管理的窗口并不是 Window 类,而是一个 View 或者 ViewGroup 类,一般就是指 DecorView 类,即一个 DecorView 就是 WmS 所管理的一个窗口。 Window 是一个 abstract 类型。

—
DecorView 类:该类是一个 FrameLayout 的子类,并且是 PhoneWindow 中的一个内部类。 Decor 的英文是 Decoration ,即“修饰”的意思, DecorView 就是对普通的 FrameLayout 进行了一定的修饰,比如添加一个通用的 Title bar ,并响应特定的按键消息等。

—
ViewRoot 类: WmS 管理客户端窗口时,需要通知客户端进行某种操作,这些都是通过异步消息完成的,实现的方式就是使用 Handler ViewRoot 就是继承于 Handler ,其作用主要是接收 WmS 的通知。

—
W 类:该类继承于 Binder ,并且是 ViewRoot 的一个内部类。

—
WindowManager 类:客户端要申请创建一个窗口,而具体创建窗口的任务是由 WmS 完成的, WindowManager 类就像是一个部门经理,谁有什么需求就告诉它,由它和 WmS 进行交互,客户端不能直接和 WmS 进行交互。

6.1.3
Linux驱动

Linux 驱动和 Framework 相关的主要包含两部分,分别是 SurfaceFlingger SF )和 Binder 。每一个窗口都对应一个 Surface SF 驱动的作用是把各个 Surface 显示在同一个屏幕上。

Binder 驱动的作用是提供跨进程的消息传递。

APK程序的运行过程

首先, ActivityThread main() 函数中开始执行,调用 prepareMainLooper() UI 线程创建一个消息队列 (MessageQueue)

然后创建一个 ActivityThread 对象,在 ActivityThread 的初始化代码中会创建一个 H Handler )对象和一个 ApplicationThread Binder )对象。其中 Binder 负责接收远程 AmS IPC 调用,接收到调用后,则通过 Handler 把消息发送到消息队列, UI 主线程会异步地从消息队列中取出消息并执行相应操作,比如 start stop pause 等。

接着 UI 主线程调用 Looper.loop() 方法进入消息循环体,进入后就会不断地从消息队列中读取并处理消息。

ActivityThread 接收到 AmS 发送 start 某个 Activity 后,就会创建指定的 Activity 对象。 Activity 又会创建 PhoneWindow 类→ DecorView 类→创建相应的 View 或者 ViewGroup 。创建完成后, Activity 需要把创建好的界面显示到屏幕上,于是调用 WindowManager 类,后者于是创建一个 ViewRoot 对象,该对象实际上创建了 ViewRoot 类和 W 类,创建 ViewRoot 对象后, WindowManager 再调用 WmS 提供的远程接口完成添加一个窗口并显示到屏幕上。

接下来,用户开始在程序界面上操作。 KeyQ 线程不断把用户消息存储到 QueueEvent 队列中, InputDispatcherThread 线程逐个取出消息,然后调用 WmS 中的相应函数处理该消息。当 WmS 发现该消息属于客户端某个窗口时,就会调用相应窗口的 W 接口。

W 类是一个 Binder ,负责接收 WmS IPC 调用,并把调用消息传递给 ViewRoot ViewRoot 再把消息传递给 UI 主线程 ActivityThread ActivityThread 解析该消息并做相应的处理。在客户端程序中,首先处理消息的是 DecorView ,如果 DecorView 不想处理某个消息,则可以将该消息传递给其内部包含的子 View 或者 ViewGroup ,如果还没有处理,则传递给 PhoneWindow ,最后再传递给 Activity

6.3
客户端中的线程

在多任务操作系统中,任何程序都运行在线程之中。系统首先会为客户端程序分配一个线程,然后该线程从程序的入口处开始执行。那么,请思考以下问题。

—
Android APK 程序中都有哪些线程?

—
什么是 UI 线程?

—
程序中自定义 Thread UI 线程的区别是什么?

首先,很明确地讲,包含有 Activity 的客户端程序至少包含三个线程,如图 6-1 所示。每个 Binder 对象都对应一个线程, Activity 启动后会创建一个 ViewRoot.W 对象,同时 ActivityThread 会创建一个 ApplicationThread 对象,这两个对象都继承于 Binder ,因此会启动两个线程,负责接收 Linux Binder 驱动发送 IPC 调用。最后一个主要线程也就是程序本身所在的线程,也叫做用户交互( UI )线程,因为所有的处理用户消息,以及绘制界面的工作都在该线程中完成。

为了验证这一点,可以在 Eclipse 中新建一个 Hello Android 的程序,然后以 debug 的方式运行,在 debug 窗口中会看到如图 6-1 所示的界面。

6-1
程序中线程

自定义 Thread UI 线程的区别在于, UI 线程是从 ActivityThread 运行的,在该类中的 main() 方法中,已经使用 Looper.prepareMainLooper() 为该线程添加了 Looper 对象,即已经为该线程创建了消息队列( MessageQueue ),因此,程序员才可以在 Activity 中定义 Handler 对象(因为声明 Handler 对象时,所在的线程必须已经创建了 MessageQueue )。而普通的自定义 Thread 是一个裸线程,因此,不能直接在 Thread 中定义 Handler 对象,从使用场景的角度讲,即不能直接给 Thread 对象发消息,但是却可以给 UI 线程发消息。

摘自:http://bbs.gfan.com/thread-2765273-1-1.html

分享到:
评论

相关推荐

    Android平台开发之旅(第2版)

    根据提供的标题、描述和部分上下文内容,“Android平台开发之旅(第2版)”这本书主要聚焦于Android平台的应用程序开发。虽然提供的部分内容并没有直接涉及到具体的Android开发知识点,但我们可以基于书名和主题,来...

    android开发之旅3.pdf

    在Android开发之旅中,深入理解Android系统的架构是至关重要的。本篇主要探讨Android系统架构的五个核心组成部分:Linux Kernel、Android Runtime、Libraries、Application Framework和Applications。 1. **Linux ...

    Android开发之旅(2):android架构.pdf

    【Android开发之旅(2): Android架构】 Android架构是理解Android操作系统基础的重要环节,它由五个主要部分构成:Linux Kernel、Android Runtime、Libraries、Application Framework和Applications。在深入探讨每个...

    Android开发之旅(2):android架构.doc

    Android开发之旅的第二篇章主要探讨的是Android系统的架构,这一部分对于初学者来说至关重要,因为它提供了对Android系统全貌的理解,避免在学习过程中迷失方向。Android架构由五个主要部分构成: 1. **Linux ...

    Android开发之旅(2):android架构[借鉴].pdf

    Android系统架构主要分为五个部分:Linux Kernel、Android Runtime、Libraries、Application Framework和Applications。本文将逐一解析这些组成部分。 1. Linux Kernel: Android系统的基础是Linux内核,它提供了...

    Android开发之旅(2):android架构宣贯.pdf

    在本篇中,我们将深入探讨Android系统的五个主要组成部分:Linux Kernel、Android Runtime、Libraries、Application Framework和Applications。 首先,Linux Kernel是Android的基础,它提供了核心系统服务,如安全...

    Android系统源代码情景分析 【罗升阳】

    罗升阳,2007年毕业于浙江大学计算机系,2010年毕业于上海交通大学计算机系,在国内知名IT技术社区CSDN上发表了数十篇高质量的Android系统原创性文章,并且开设博客专栏--《老罗的Android之旅。 在内容上,本书结合...

    android4.4源码 android-19源代码

    总结,Android 4.4源码的学习是一次深入操作系统底层的探索之旅,它涵盖了操作系统、软件工程、硬件交互等多个领域。通过解析和理解源码,开发者不仅可以提升技术水平,还能为优化应用性能、开发定制系统提供有力...

    Android系统源代码情景分析 PDF 完整版 ZIP.002(二个压缩包)

    ndroid系统源代码情景分析的评论 ...在国内知名IT技术社区CSDN上发表了数十篇高质量的Android系统原创性文章,并且开设博客专栏--《老罗的Android之旅》,积极与网友互动,深受大家喜爱,访问量一直居于前茅。

    Android2.2源码core包

    Android 2.2,也称为Froyo(冻酸奶),是Android操作系统的一个重要版本,它在2010年发布,带来了许多性能提升和新功能。...这是一次宝贵的探索之旅,可以为Android开发者的技能树添加重要的分支。

    framework_intermediates

    在Android开发领域,`framework_intermediates`是一个关键的概念,它涉及到Android系统的内核框架以及开发者如何通过系统内部机制来扩展功能。这个概念通常与构建过程、系统库和反射技术密切相关。下面将详细阐述`...

    android4.0源码

    深入研究Android 4.0源码对于开发者来说是一次宝贵的探索之旅,不仅可以提升对Android操作系统的理解,也有助于进行系统级别的优化和定制,以及开发更加高效、稳定的Android应用。同时,对于想要从事Android系统开发...

    Android系统源代码情景分析 PDF 完整版 ZIP.001(二个压缩包)

    Android系统源代码情景分析的评论 ...在国内知名IT技术社区CSDN上发表了数十篇高质量的Android系统原创性文章,并且开设博客专栏--《老罗的Android之旅》,积极与网友互动,深受大家喜爱,访问量一直居于前茅。

    Android开发环境搭建图文并茂全过程

    Android开发环境搭建是每个想...遵循这些步骤,开发者可以快速地建立起一个完整的Android开发环境,开始他们的Android编程之旅。对于初学者来说,这是一份非常实用的指南,有助于避免在环境搭建过程中遇到的常见问题。

    Android 入门笔记

    Android 是一个开源的移动操作系统,由Google在2007年推出,主要针对智能手机和平板电脑,但后来也扩展到了...通过搭建Android 开发环境,开发者可以开始他们的编程之旅,创造出各种各样的应用来满足不同用户的需求。

    Windows下Android应用程序开发环境搭建详解.doc

    在Windows操作系统中搭建Android应用程序开发环境是一项至关重要的任务,尤其对于初学...这个过程虽然可能稍显复杂,但是一旦完成,就可以开启Android应用开发之旅,利用强大的Android框架和库创造无限可能的应用程序。

    android入门教材

    ### Android入门教材:详解Android开发基础 #### 一、Android平台概述 Android是基于Linux内核的操作系统,自2007年11月由...希望每位学习者都能通过本教材,开启自己的Android开发之旅,创造出令人惊叹的移动应用。

Global site tag (gtag.js) - Google Analytics