By 高焕堂 2011/09/09  

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

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

                                                                                                            

[Go Back] 

 

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

如何让App开发者来使用Native Service/HAL呢?

 

1.  基本动作:开发一个Native Service

    首先以C++语言开发一个Native Service,取名为POSService.cpp,它透过HAL接口呼叫HAL Stub模块。将它编译和连结成为*.SO动态库。将此*.SO放入Android的/system/lib裡;然后启动它,让他执行于一个进程(Process)里,如下图: 

 

图1、C++层Client跨进程取得SQRService的服务

 

2.  C++ 层的App

    C++层的AP开发者,只需要撰写他的App,例如取名为myAP.cpp。此时他只要使用指令: 

             sp<IServiceManager> sm = defaultServiceManager();

             m_ib = sm->getService(String16("misoo.myservice"));

    其首先呼叫ServiceManager去绑定myService服务,绑定完成时,会在AP的进程里,诞生一个BpBinder物件,并将其IBinder接口回传给myAP.cpp应用程序。如下图:

  

   图2、C++层Client跨进程取得POSService的服务(一)

  

   图3、C++层Client跨进程取得POSService的服务(二)

        

3.  一致的getSystemService()服务接口

     关于这个,Jollen在其文章 http://www.jollen.org/blog/2010/02/override-context-getsystemservice.html 里写道:

 「 Context.getSystemService() 是一个很重要的 API,也是Android 应用程控硬件的起点。在一个开发项目中,如何扩展 getSystemService() 的实作成为一个重要的课题。几天前与客户进行技术讨论时,适巧讨论到这个议题,因此在这里做一个简单的纪录与大家分享。应用程序要存取手机上的 Sensor 装置时,须取得 SensorManager 对象,程序写法如下: 

public class mokoidSensor extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);         
        SensorManager sensor = (SensorManager)getSystemService(SENSOR_SERVICE);
        sensor.getSensors();
        /* Do something. */
    }}

如果手机上有一个「马达」装置,程序代码的写法,依此逻辑来推论,设想的程序代码会是这样:

     MotorManager motor = (MotorManager)getSystemService(MOTOR_SERVICE);

     // 省略后续部分

     //  ……

     如何实践这条Android Service途径,Jollen在其著名的Android系列课程里,有非常出色的呈现。

 

4.  SensorService的「Native化」

      关于这个议题,Jollen在其2011年的文章: << Android 2.3 的更新:SensorService 的「Native 化」>> 

http://www.jollen.org/blog/2011/01/andriod-23-sensorservice-native.html 里写道:

近期在进行 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 2.2/2.3 可能是并行的关系,而非取代关系。因此,Android 2.2 以及 Android 2.3 的学习必要性很高;意思是,最好能由 2.1/2.2 的框架开发开始学习。了解 Android 2.1/2.2 的 SensorService 架构,再对 Android 2.3 的 SensorService 进行了解,除了可比较其设计与实作差异外,也能知道「效能改进之道」。了解过去 SensorService 架构与实作上的不足,以及 Android 2.3 的改写,解决了什么问题。Android 2.3 的 libhardware 没有太大变动。从 Anroid 2.1/2.2 开始的开发者,可以由 Android 2.3 的 SensorService 做为「更新知识」的进入点。 

      在Jollen文章里并没有说明,Android 2.3版里将SensorService从Android Service移出来的幕后原因;我也还没去探究这个Native化的SensorService是否仍跑在SystemServer进程里,或是与CameraService等跑在同一个进程[歡迎光臨 高煥堂 網頁: http://www.cnblogs.com/myEIT/ ]

 

5.  Native Service的弹性

       基于我在日本开发Android-based POS产品的经验,采取Native Service来呈现POS专属HAL Stub服务,最主要的优点就是弹性。如下图所示: 

 

  图4、Native Service主要的优点是:弹性

    其弹性的观点如下: 

  • Native Service可以自主决定跑在哪一个进程里,尤其是跑在独立的进程里。
  • 可以让C/C++的Client(如上图的POSService.cpp)使用此Native Service。
  • 可以撰写C/C++模块来加强 Native层的数据处理,例如加速QR-code等影像处理。
  • 放弃getSystemService()接口的束缚,让Java层更能百花齐放,创造多样化,例如可以衔接到应用程序里的SDK Service,成为专属的应用程序。
  • 还有其它弹性的组合。 

6.  结语

      基于Android的开源和开放平台,我们能自主性地决定如何将专属硬件的创新功能呈现于应用程序上。至于如何将应用程序与驱动程序衔接起来,本文所述的两种途径都是可行的。Jollen在Android Service途径上,已经有非常完整的说明和范例。关于Native Service途径,我的文章也有很完整的叙述和范例。希望这些经验能加速你的系统或产品开发和上市

[Go Back]