
内核研究_framework
文章平均质量分 78
manoel
这个作者很懒,什么都没留下…
展开
-
【内核研究】Framework常见问题
Acitivity之间如何传递消息(数据)首先,提出这个问题的原因是,程序员需要在不同的Activity之间传递数据,然而,这个问题本身就有问题。所谓"传递消息"一般是指多个线程之间,而Activity本身并不是线程,ActivityThread才是一个线程,即UI线程。同一个程序中的多个Activity都由ActivityThread进行调用,Activity本身只是一个Java类而已,就像Rect、Trigle类一样,如果有人问"Rect类和Trigle类之间如何传递消息",你会不会觉得有点奇怪?原创 2014-09-24 10:18:07 · 1064 阅读 · 1 评论 -
【内核研究】保证包裹内参数顺序aidl工具的使用(下)
这些代码主要完成以下三个任务。定义一个Java interface,内部包含aidl文件所声明的服务函数,类名称为IMusicPlayerService,并且该类基于IInterface接口,即需要提供一个asBinder()函数。定义一个Proxy类,该类将作为客户端程序访问服务端的代理。所谓的代理主要就是为了前面所提到的第二个重要问题--统一包裹内写入参数的顺序。定义一个Stub类,这是一个a原创 2014-09-28 18:44:46 · 1415 阅读 · 0 评论 -
【内核研究】Framework框架
Framework定义了客户端组件和服务端组件功能及接口。以下阐述中,“应用程序”一般是指“.apk”程序。框架中包含三个主要部分,分别为服务端、客户端和Linux驱动。服务端服务端主要包含两个重要类,分别是WindowManagerService(WmS)和ActivityManagerService(AmS)。WmS的作用是为所有的应用程序分配窗口,并管理这些窗口。包括分配窗口的大小,调节各窗口的叠放次序,隐藏或者显示窗口。AmS的作用是管理所有应用程序中的Activity。除此之外,原创 2014-09-23 15:51:12 · 1708 阅读 · 8 评论 -
【内核研究】Binder服务端设计
设计Service端很简单,从代码的角度来讲,只要基于Binder类新建一个Servier类即可。以下以设计一个MusicPlayerService类为例。假设该Service仅提供两个方法:start(String filePath)和stop(),那么该类的代码可以如下: 当要启动该服务时,只需要初始化一个MusicPlayerService对象即可。比如可以在主Activity里面初始化一个原创 2014-09-26 16:21:20 · 1507 阅读 · 0 评论 -
【内核研究】获取Binder对象
事实上,对于有创造力的程序员来讲,可以完全不使用Service类,而仅仅基于Binder类编写服务程序,但只是一部分。具体来讲,可以仅使用Binder类扩展系统服务,而对于客户端服务则必须基于Service类来编写。所谓的系统服务是指可以使用getSystemService()方法获取的服务,所谓的客户端服务是指应用程序提供的自定义服务。关于Service的内部机制请参考第14章,本章仅指出Ser原创 2014-09-28 17:55:53 · 2048 阅读 · 0 评论 -
【内核研究】Binder框架概述
Binder,英文的意思是别针、回形针。我们经常用别针把两张纸"别"在一起,而在Android中,Binder用于完成进程间通信(IPC),即把多个进程"别"在一起。比如,普通应用程序可以调用音乐播放服务提供的播放、暂停、停止等功能。Binder工作在Linux层面,属于一个驱动,只是这个驱动不需要硬件,或者说其操作的硬件是基于一小段内存。从线程的角度来讲,Binder驱动代码运行在内核态,客户端程序调用Binder是通过系统调用完成的。Binder是一种架构,这种架构提供了服务端接口、Binder原创 2014-09-25 19:21:41 · 1789 阅读 · 1 评论 -
【内核研究】客户端中的线程
在多任务操作系统中,任何程序都运行在线程之中。系统首先会为客户端程序分配一个线程,然后该线程从程序的入口处开始执行。那么,请思考以下问题。— Android APK程序中都有哪些线程?— 什么是UI线程?— 程序中自定义Thread和UI线程的区别是什么?首先,很明确地讲,包含有Activity的客户端程序至少包含三个线程,如图6-1所示。每个Binder对象都对应一个线程,Activity启动后原创 2014-09-23 16:33:32 · 1726 阅读 · 0 评论 -
【内核研究】Binder客户端设计
要想使用服务端,首先要获取服务端在Binder驱动中对应的mRemote变量的引用,获取的方法后面小节将有介绍。获得该变量的引用后,就可以调用该变量的transact()方法。该方法的函数原型如下:其中data表示的是要传递给远程Binder服务的包裹(Parcel),远程服务函数所需要的参数必须放入这个包裹中。包裹中只能放入特定类型的变量,这些类型包括常用的原子类型,比如String、int原创 2014-09-26 16:58:03 · 1190 阅读 · 0 评论 -
【内核研究】保证包裹内参数顺序aidl工具的使用(上)
关于第二个问题,Android的SDK中提供了一个aidl工具,该工具可以把一个aidl文件转换为一个Java类文件,在该Java类文件,同时重载了transact和onTransact()方法,统一了存入包裹和读取包裹参数,从而使设计者可以把注意力放到服务代码本身上。aidl工具不是必需的,对于有经验的程序员来讲,手工编写一个参数统一的包裹存入和包裹读出代码并不是一件复杂的事情。接下来看aidl原创 2014-09-28 18:32:14 · 1589 阅读 · 0 评论 -
【内核研究】理解Context
Context是什么一个Context意味着一个场景,一个场景就是用户和操作系统交互的一个过程。在广义上,这个所谓的过程应该包括前台界面和后台数据。举个例子,比如当你打电话的时候,场景包括电话程序对应的界面以及隐藏在界面后的数据。从程序的角度来看,一个Activity就是一个Context,一个Service也是一个Context。从语义的角度来看一下Context。谷歌程序员把“场景”抽象为Context类,他们认为用户和操作系统的每一次交互都是一个场景,比如打电话,发短信。从代码的角原创 2014-09-23 14:23:59 · 4775 阅读 · 0 评论 -
【内核研究】程序的运行过程
首先,ActivityThread从main()函数中开始执行,调用prepareMainLooper()为UI线程创建一个消息队列(MessageQueue)。然后创建一个ActivityThread对象,在ActivityThread的初始化代码中会创建一个H(Handler)对象和一个ApplicationThread(Binder)对象。其中Binder负责接收远程AmS的IPC调用,接收原创 2014-09-23 15:58:55 · 1672 阅读 · 0 评论 -
【内核研究】循环接收者_Looper
Looper的作用有两点: 为调用静态方法prepare()的线程创建一个消息队列MessageQueue。 提供静态方法loop(),使调用该方法的线程进入无限循环,并从消息队列中读取消息。如何创建消息队列Looper的静态方法prepare()中,会给线程局部存储添加一个新的Looper对象,而Looper的构造函数中,会创建一个MessageQueue消息队列,代码如下: /** Initialize the current thread as a looper.原创 2014-10-09 11:58:12 · 1259 阅读 · 0 评论 -
【内核研究】处理者_Handler
尽管MessageQueue提供了直接读/写的函数接口,但对于程序员来说,一般不直接读/写消息队列。之前了解到,在Looper.loop()函数中,当取出消息后,会回调msg.target对象的handleMessage()函数,而msg.target的类型正是Handler。 /** * Run the message queue in this thread. Be sure to call * {@link #quit()} to end the loop.原创 2014-10-09 14:37:24 · 1528 阅读 · 1 评论 -
【内核研究】消息队列_MessageQueue
消息队列采用排队方式对消息进行处理,即先到的消息会先得到处理,但如果消息本身指定了被处理的时刻,则必须等到该时刻才能处理该消息。消息在MessageQueue中使用Message类表示,队列中的消息以链表的结构进行保存,Message对象内部包含一个next变量,该变量指向下一个消息对象。MessageQueue中的两个主要函数是“取出消息”和“添加消息”,分别是next()和enquenceMessage()。next()函数final Message next() { int原创 2014-10-09 14:14:28 · 2306 阅读 · 0 评论 -
【内核研究】线程局部存储_TheadLocal
通过调用Looper的静态方法prepare()为线程创建MessageQueue对象,代码如下: private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThre原创 2014-10-08 18:32:35 · 1375 阅读 · 0 评论 -
【内核研究】ServiceManager管理的服务
系统服务中的Binder对象在应用程序编程时,经常使用getSystemService(String serviceName)方法获取一个系统服务,那么,这些系统服务的Binder引用是如何传递给客户端的呢?须知系统服务并不是通过startService()启动的。getSystemService()函数的实现是在ContextImpl类中,该函数所返回的Service比较多,具体可参照源码。这些原创 2014-09-30 11:03:22 · 1896 阅读 · 0 评论 -
【内核研究】理解Manager
ServiceManager所管理的所有Service都是以相应的Manager返回给客户端,因此,这里简述一下Framework中关于Manager的语义。在我们中国的企业里,Manager一般指经理,比如项目经理、人事经理、部门经理。经理本身的含义比较模糊,其角色有些是给我们分配任务,比如项目经理;有些是给我们提供某种服务,比如人事经理;有些则是监督我们的工作等。而在Android中,Mana原创 2014-09-30 11:26:22 · 1462 阅读 · 0 评论