如何撰寫自己的第一個核心服務呢?

1. 要點:

l           核心服務通常在獨立的進程 (Process) 裡執行。

l           必須提供 IBinder 介面,讓應用程式可以進行跨進程的綁定 (Binding) 和呼叫。

l           因為共用,所以必須確保多線裎安全 (Thread-safe)

l           C++ 類別定義,誕生其物件,透過 SM 之協助,將該物件參考值傳給 IServiceManager::addService() 函數,就加入到 Binder Driver 裡了。

l           應用程式可透過 SM 之協助而遠距綁定該核心服務,此時 SM 會回傳 IBinder 介面給應用程式。

l           應用程式可透過 IBinder::transact() 函數來與核心服務互傳資料。


2. 入門級範例:將 AddService 核心服務加入 Binder Driver

此範例功能為簡單的整數加法 (Add) 運算,此核心服務命名為 AddService

Step-1 C++ 撰寫 AddService 類別,其完整程式碼為:


/*--- AddService.h 定義檔 ---*/

 

/*--- AddService.cpp 實作檔 ---*/

 

/*--- Make ---*/

/ /Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= /

AddService.cpp

 

LOCAL_C_INCLUDES := /

  $(JNI_H_INCLUDE)

LOCAL_SHARED_LIBRARIES := /

    libutils

 

LOCAL_PRELINK_MODULE := false

LOCAL_MODULE := libAdd

 

include $(BUILD_SHARED_LIBRARY)

 

執行上述 Android.mk 檔,就產出 libAdd.so 檔案了。

Step-2 C++ 撰寫一個可獨立執行的 addserver.cpp 程式,它的用途是:誕生一個 AddService 類別之物件,然後將該物件參考存入 Binder Driver 裡。其內容為:

/*--- addserver.cpp ---*/

 

編譯並連結此 addserver.cpp ,產出 addserver 可執行程式。

 

Step-3 上述兩個步驟分別產出了 libAdd.so 類別庫和 addserver 可執行程式了。接著將 libAdd.so 拷貝到 Android 模擬器的 /system/lib/ 裡;也把 addserver 拷貝到 /system/bin/ 裡。

Step-4 執行 addserver ,其中的指令:

AddServer::instantiate();

       

就執行到 AddServer 類別的 instantiate() 函數,其內容為:

 

int AddService::instantiate() {

               LOGE("AddService instantiate");

      int r = defaultServiceManager()->addService(

                   String16("guilh.add"), new AddService());

               LOGE("AddService r = %d/n", r);

return r;

}

 

其先執行到 new AddServer() ,就誕生一個 AddServer 類別之物件;接著,呼叫 defaultServiceManager() 函數取得 SM IServiceManager 介面,再呼叫 IServiceManager::addServer() 將該物件參考存入 Binder Driver 裡,如下圖所示:

3. 入門級範例:寫個 Add 類別來使用 AddService 核心服務

剛才已經成功地將 AddService 服務加入到 Binder Driver 裡了。現在,茲寫個 C++ 應用類別來繫結 (Bind) 此核心服務。

Step-5 C++ 撰寫 Add 類別,其完整程式碼為:

 

/*--- Add.h ---*/

 

/*--- Add.cpp ---*/

其中的 setN() 函數呼叫 getAddService() 函數來取得 SM 的介面參考,然後要求 SM 去協助繫結到 AddService 核心服務,完成時 SM 會回傳 BpBinder 物件的 IBinder 介面參考,然後暫存於 binder 變數裡。如下圖所示:

 4. 後語

Add.cpp通常只是用來測試核心服務而已,你也可以撰寫JNI Native 函數來呼叫核心服務的功能,例如下圖:

此外,撰寫核心服務時,必須確保多線程 (Multi-Thread) 安全性,才能提供穩定可靠的核心服務。、

 

转自:http://www.android1.net/Topic.aspx?BoardID=21&TopicID=990

作者: 高焕堂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值