By 高焕堂 2011/09/09  

[ IT史上最完整、最经典的软件框架开发技术宝典 (上百篇经典文章&eBooks) ] 

[ 請指教:高老師的免費on-line教學視頻 ] 

                                                                                                            

[Go Back] 

 

 

HAL(Hardware Abstraction Layer)技术观点(4):

区别Android Service、Native Service与JNI Native Code概念

 

1. 三者的涵意

      本文探讨Android Service、Native Service与JNI Native Code三者的涵意,并加以区别之。因为人人使用这些名词时,其幕后的涵意可能有所不同,如果能有个途径去认识这些名词幕后的涵意,会让人人读起相关文章时,消除掉心中之雾,畅快多了。例如,Android 专家Jollen在其文章里写到: 

  “谈了许多「Android Service」以及「HAL Stub」,这里再补充一点。Android操作系统启动时,会执行一个process称为servicemanager。Servicemanager process负责管理、提供并保存「Android Service」。Android Service为Java层,因此接下来会透过JNI来呼叫C/C++层的Native Service。

   广义来说,Native Service也提供Runtime的功能,即Core Library层。Runtime的重要工作之一为「取得HAL Stub所提供的API」,因此这是撰写完整Native Service的前哨站。” 

      再看看Simon Lewis的文章:<<A Standalone Android Runtime: The ServiceManager>> (摘自:http://justanapplication.wordpress.com/2009/08/20/a-standalone-android-runtime-the-servicemanager/) 其写到: 

“The SystemServer needs a functioning Binder so that services can be added to, and retrieved from, the ServiceManager as it starts up. A service is added as a name/Binder pair using the android.os.ServiceManager method:

          public static void addService(String name, IBinder service)

A service is retrieved by name using the android.os.ServiceManager:

          public static IBinder getService(String name)

If it is found then the corresponding Binder registerd with the ServiceManager is returned, which can then be used to access the functionality of the named service.” 

       在上面的Jollen文章里,他提到:“Servicemanager process负责管理、提供并保存「Android Service」。”说明了在系统启动时,Android Service会被ServiceManager所保存。这里的「保存」就是Simon Lewis所说的:“The SystemServer needs a functioning Binder so that services can be added to, and retrieved from, the ServiceManager as it starts up. ” 

   于是可知,Jollen的Android Service(指功能)一词与Simon所提的SystemServer(指套件)是同一件事物的两个不同名词。再来看看Jollen的Native Service一词,他写到: 

“Android Service为Java层,因此接下来会透过JNI来呼叫C/C++层的Native Service。   广义来说,Native Service也提供Runtime的功能,即Core Library层。” 

    这里,Jollen对Native Service采取广义的概念,其范围涵盖了Core Libraries里的JNI Native Code。如果采取狭义的概念,Native Service并不涵盖Core Libraries里的JNI Native Code。反而,Core Libraries里的JNI Native Code应该归属于Android Service里,是Android Service的实作(Implementation)部分。

    就如Jollen的新文章(2011/1/3)里,他对Native Service就采取狭义的概念: 

    “近期在进行 Android 2.3 的新框架程序代码研究,Android 2.3 在 Platform (Framework) 部份包含了许多重大的更新,其中一个部份就是 SensorService 改写成 Native Service 形式。在 Android 2.2 以前的框架,SensorService 包含在 SystemServer 里,实务上,可能也会对 SensorService 做小幅度改写,以增进效能,或是将 SensorService 独立成为一个 process。在 Android 2.3 里的 SystemServer 已经找不到 SensorService 了,这个重要的 Android Service 被改写成 Native Service。「如何将 Android Service 改写为 Native Service」,以及「Native Service」的开发,从 Android 2.3 开始,将成为重量级主题。” 

     Android Service是以Java撰写的,所以需要依赖其JNI Native Code来与C/C++层的HAL沟通。 [歡迎光臨 高煥堂 網頁: http://www.cnblogs.com/myEIT/ ]

     Native Service是以C/C++撰写的,可以直接与HAL沟通;反而是Java层的AP或SDK Service必须依赖JNI Native Code来与Native Service沟通。

  

图1、Android Service、Native Service与JNI Native Code的关系图 

       无论是Android Service或Native Service都必须提供IBinder,并且由ServiceManager在系统启动时就加入Binder Driver里,可让后来加载的AP等来绑定(Bind)、连结(Connect)和呼叫(Invoke)。 

 

  图2、Core Service概念图 

2. 系统服务(System Service)

     由于人人对Android Service的涵意并不相同。例如,有的将它与SystemServer画上等号;而有些人心中的Android Service涵意并不局限于SystemServer套件里的服务;而有些认为SystemServer套件里的有些功能并不算是Android Service。导致Android Service变成一个泛用名词了。于是,我独创一个定义比较清晰的新名词:核心服务(Core Service),来涵括上图2里的Android Service和Native Service。它们的特性是:

  • 提供IBinder接口。
  • 在系统启动时就诞生,且由ServiceManager将其加入到Binder Driver里。
  • AP透过ServiceManager来绑定所需的系统服务,并透过IBinder进行IPC通讯。
  • 系统服务可以用Java或C++语言开发。
  • 以Java开发的就是上图里的Android Service;而以C++开发的就是上图里的Native Service。 

希望「核心服务」新名词不要造成您更大的概念混淆。基于这个系统服务,我们可以联想到:我们也可以撰写自己的系统服务(以Java或C++撰写)。例如,以Java来撰写自订的Java层系统服务,如下图:  

  

 图3、自订的Java层Core Service (System Service)

                                                                                                                                            

[Go Back]