Android Application Framework Outside, Service Understanding : 2
这是一篇旧文了,写于二零一零年七月至九月期间。当时我正在OPPO,完了电纸书项目,刚刚转入公司战略级项目,受命专职钻研Android Framework。本文即为当时的工作成果,曾以此为蓝本,组织了内部培训。本文成文后半月,我因不可抗拒原因,离开了OPPO,对Framework的研究中断,遂失去了一次专心研究Android的良机,深感痛惜。今日我把它晒出来,一来是温故旧知,二来帮助他人,但受限于既有知识,对Android的理解依旧是囫囵吞枣,文中谬误之处再所难免,恳请读者指正。
Contents
- Forward
- Android Startup
- Service Overview
- Application Service
- Android Service
- Native Service
- System (Linux) Service
- Manage Service
- Manage Android Service
- Behind ServiceManager Class
- Manage Native Service
- Behind defaultServiceManager
- Inter Process Communication
- From Java to Native
- What’s BpBinder
- 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非常重要。
Android Service
Android源代码中,在framework/base/services路径下可以看到各种以XxxService形式命名的java文件,但没有继承自android.app.Servic。透过文件组织结构,先来对其概貌做一个了解,如图表3所示。
抛开jni和tests两个文件夹不谈,java文件夹诸如“XxxService”一类的文件共有三十五个之多,如图表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不错的利器。
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。
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这个名字更适合它。