By 高焕堂 2011/09/04
[ IT史上最完整、最经典的软件框架开发技术宝典 (上百篇经典文章&eBooks) ]
[Go Back]
HAL(Hardware Abstraction Layer)技术观点(3):
Android Service与JNI Native Code之关系
1. 前言
到底甚么是Android Service呢? 几乎人人所谈都不尽相同。有人依据Java的套件而分,例如Android 2.1里,SensorService.java和ActivityManagerService.java属于不同的套件,有人说SensorService是一项Android Service;而ActivityManagerService则不是。另有人说两者都属于Android Service。本文就从HAL的角度来看Android Service与其它相关模块的关系,例如Android Service与JNI之关系。从这些关系里,更能深刻掌握Android Service的定位和角色。 [歡迎光臨 高煥堂 網頁: http://www.cnblogs.com/myEIT/ ]
2. 三种服务
只要一谈到Android Service,几乎人人所谈都不尽相同了。更不用说又加上SDK Service了。例如,Android 专家Jollen写道:
“Android的Service分为二种:Android Service与Native Service。
- Android Service-- Android Service又称为Java Service,是实作在框架层(framework)里的「Server」。这里所讲的「Service」是System Service,又称为Server,与应用程序设计上所讨论的Service(android.app.Service)不同。Android Service以Java撰写。
- Native Service-- Native Service则是实作在Runtime层里的Server。架构设计上,我们有二个选择,一个是实作Android Service、再透过JNI与HAL stub沟通;另一个选择是,跳过Android Service,让Application(Manager API)直接与Native Service沟通。”
Jollen在这段话里,明显地提到两种服务:Android Service和Native Service。然而,他又提到:“与应用程序设计上所讨论的Service(android.app.Service)不同。”这种android.app.Service就是一般通称的APP Service或SDK Service了。所以Jollen提到三种服务:1)SDK Service、2)Android Service和3)Native Service。其关系如下图:
图1、三种Service
3. Android Service与JNI等元素之关系
那么,这些元素之间又有何关系呢? Jollen在其文章里,写道:
“采取Service架构的方式,是建议的做法,当然因为这是标准架构,也应该采用。Service在Android框架里的角色是「存取底层硬件」,往上层的话,可以和应用程序沟通。因此,采用标准的Service做法,好处是在数据存取(data communication)的处理较为系统化。这方面,Android提供了标准的处理架构,后续再进行讨论。图上的「core libraries」即是Service程序代码的实作,也就是,Android应用程序透过JNI(Dalvik)来到Service这一层,再透过Service加载*.so檔;而非标准做法则是让应用程序直接透过JNI来加载*.so檔。”
4. 非标准做法
其中,非标准做法:让应用程序直接透过JNI来加载*.so檔。其架构如下图:
图2、非标准做法
非标准做法也是可(执)行的途径之一。
5. 标准做法
至于Jollen所说的标准做法:
“Android应用程序透过JNI(Dalvik)来到Service这一层,再透过Service加载*.so檔;”
其架构如下图:
图3、标准做法
6. Native做法
以上两种做法,都是可行的。此外,还有另一种更具弹性的做法,就是采取NativeService途径。就如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 开始,将成为重量级主题。”
将Java的SensorService 改写成C++的 Native Service 形式,其新的架构将更改如下图:
图4、NativeService做法
这种NativeService做法并不新做法,其实自从Android问市以来,MediaPlayerService和CameraService等即是采取NativeService做法了。无论哪一种做法,JNI Native Code都扮演重要角色。◆
[Go Back]