• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
 






高煥堂.EIT

 
 

Powered by 博客园
博客园 | 首页 | 新随笔 | 联系 | 订阅 订阅 | 管理

HAL-Sec-03

By 高焕堂 2011/09/04

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

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

                                                                                                            

[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]

 

发表于 2013-10-29 20:04  高煥堂.EIT  阅读(154)  评论(0)    收藏  举报
 
刷新页面返回顶部