Android Application Framework Outside, Service Understanding : 2

这是一篇旧文了,写于二零一零年七月至九月期间。当时我正在OPPO,完了电纸书项目,刚刚转入公司战略级项目,受命专职钻研Android Framework。本文即为当时的工作成果,曾以此为蓝本,组织了内部培训。本文成文后半月,我因不可抗拒原因,离开了OPPO,对Framework的研究中断,遂失去了一次专心研究Android的良机,深感痛惜。今日我把它晒出来,一来是温故旧知,二来帮助他人,但受限于既有知识,对Android的理解依旧是囫囵吞枣,文中谬误之处再所难免,恳请读者指正。

Contents

  1. Forward
  2. Android Startup
  3. Service Overview
    1. Application Service
    2. Android Service
    3. Native Service
    4. System (Linux) Service
  4. Manage Service
    1. Manage Android Service
    2. Behind ServiceManager Class
    3. Manage Native Service
    4. Behind defaultServiceManager
  5. Inter Process Communication
    1. From Java to Native
    2. What’s BpBinder
    3. What’s BBinder

Service Overview

Service一词在Android中出现的概率非常大,以致不同上下文(Context)在着较大差异。如果详细划分,则可以分为四类:Application Service、Android Service、Native Service、System (Linux) Service。

尽管存在着差异,但是透过Reference中对Application Service的描述,仍旧可以概括出所有Service的本质:

A Service is an (application) component representing either an application’s desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use.

Application Service

通过继承android.app.Service而创建服务,是应用开发人员最为熟悉的应用场景。此时的服务通常称为应用服务(Application Service),其和Activity、BroadcastReceiver和ContentProvider一起构成了Android四大应用组件(Application Component)。

一般应用中都会自行创建自己的服务,在SDK的sample里,示例ApiDemos中提供了Remote Service Binding详细演示了如何创建和使用。图表2展现其中各个类之间的关系。

注意:IRemoteService、ISecondary、IRemoteServiceCallback三个类还有一个共同的父类就是IInterface,图中没有展现,但这一点对理解IPC非常重要。

Remote Service Binding

图表2 Remote Service Binding

Android Service

Android源代码中,在framework/base/services路径下可以看到各种以XxxService形式命名的java文件,但没有继承自android.app.Servic。透过文件组织结构,先来对其概貌做一个了解,如图表3所示。

图表3

抛开jni和tests两个文件夹不谈,java文件夹诸如“XxxService”一类的文件共有三十五个之多,如图表4所示。

图表 4

提醒:如此多的Service,但它们的包名(package name)却是com.android.server,而不是com.android.service。

如此众多的Service共同构成了Android Service(找不到更合适的名字,考虑过使用Java Service以便和下文Native Service对应,但最终没有采用)。

严格地讲,并不是每一个包含了Service字眼的Class就是一个Android Service。图表4并不能如实反映系统某一个时刻Service运行的真实情况,Android提供了一个很棒的同名工具—service。

使用service list命令了解当前有哪些服务在运行,效果如图表5所示(部分结果)。除list外,service还可以搭配check和call实现其他功能,是帮助分析Service不错的利器。

图表 5

Native Service

Android的应用编程语言(Application Program Language)为Java,这意味着开发人员在享用Java的便捷的同时,也在承受Java的局限、效率等弊病。在Android中并不是所有的Service都是用Java来编写,例如AudioPolicyService。

所谓Native Service是指采用C++/C来实现的Service,透过system_init.cpp中的system_init方法可以知道,在Android一共有SurfaceFlinger、AudioFlinger、MediaPlayerService、CameraService和AudioPolicyService。

图表 6

System (Linux) Service

Android的开机流程是加电后执行bootloader,接着被引导进入kernel,完成之后启动用户进程init。此时系统将按照init.rc来启动服务,包括console、adbd、servicemanager、vold、zygote、bootanim等。

注意:servicemanager就是下文中管理各类服务的服务!

这些在底层活动的daemon process,称为System Service受之无愧。但是由于和Application,甚至和Framework都关系非常少,所以暂不用理会它。

因为用的少,System Service这一名字常常被挪做他用,很多时候用来指代Android Service或Native Service,以至于我认为Linux Service这个名字更适合它。

Leave a comment

Your comment