Android4.0添加底层核心服务
一、為?Android添加底層核心服務
1.?????為什么要寫底層核心服務呢?
?????????因為底層核心服務是?Android框架里最接近?Linux/Driver的部分。為了充分發揮硬件設備的差異化特性,核心服務是讓上層?Java應用程序來使用?Driver/HW Device?特色的重要管道。例如?Media、?Telephone等底層硬件。
???????在開機過程中,就可以啟動核心服務(漢字輸入法服務等),讓眾多應用程序來共同使用。由于共用,所以能有效降低?Java應用程序的大小(?Size)。
2.?????核心服務與?Java?層的?Service有何區別和關系?
???????Android具有兩層服務
?????????????--Java層?SDK-based Service
?????????????--C++層的?Code Service
????
?
3.?編寫自己的核心服務(?C++?層)
1).?要點
??????核心服務通常在獨立的進程(?Process?)里執行。
??????必須提供?IBinder?接口,讓應用程序可以進行跨進程的綁定(?Binding?)和調用。
??????因為共用,所以必須確保多線程安全(?Thread-safe?)。
????? 使用?C++?來實現,并調用?IServiceManager::addService()?函數添加到系統的?Binder Driver?里。
????? 上層應用程序通過?ServiceManager?獲取該服務。
????? 上層應用程序通過?IBinder::transact()?函數來與核心服進行數據交互。
2).?添加服務
下面詳細介紹如何添加一個底層服務到系統中,假設服務名為?TestService?,其用途是對傳入的參數加上?1000?,并返回結果。
服務實現
??????進入?android?源碼的frameworks/base?,在該目錄下建立自己的目錄,假設為?Testservice?,再在這個目錄中建立兩個子目錄?Testserver?和libTestservice?,?Testserver?用于存放服務的啟動文件,其最終的生成為可執行文件,在系統啟動的時候運行,?libTestservice?用于存放服務的實現文件,最終會生成動態鏈接庫,有?addserver?調用。
首先,服務的實現文件libTestservice?包括兩個文件,TestService.h?和?TestService.cpp?,
以下是?TestService.h?:
#ifndef ANDROID_JOBEN_TEST_SERVICE_H #define ANDROID_JOBEN_TEST_SERVICE_H#include <utils/RefBase.h> #include <binder/IInterface.h> #include <binder/Parcel.h> #include <utils/threads.h>namespace android {class TestService:public BBinder{//從BBinder 派生, 實現本地接口public:static int instantiate();TestService();virtual ~TestService();virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);}; };//namespace #endif
然后是服務的實現文件?TestService.cpp?:
以下是編譯服務的?Android.mk?,和上面的?cpp?放在一起。
在命令行中退出到?android/目錄級?加載編譯環境?. build/envsetup.sh
然后?lunch。
然后選擇你的具體平臺
然后在?cd /frameworks/base/addservice/libaddservice/?目錄?輸入?mm
之后在?out?目錄產出?libTest.so?文件。
在此?完成核心服務第一步。
服務進程實現
??????? 進入到?cd??/android/frameworks/base/Testservice/Testserver/?目錄
???? 增加一個文件?Testserver.cpp?,文件內容如下:
?
#include <sys/types.h> #include <unistd.h> #include <grp.h> #include <binder/IPCThreadState.h> #include <binder/ProcessState.h> #include <binder/IServiceManager.h> #include <utils/Log.h> #include <private/android_filesystem_config.h> //#include <libadd/AddService.h> #include "../libtestservice/TestService.h"using namespace android;int main(int argc, char **argv) {sp<ProcessState>proc(ProcessState::self());sp<IServiceManager>sm = defaultServiceManager();//取得ServiceManagerLOGI("ServiceManager:%p", sm.get());TestService::instantiate();//把自己添加到ServiceManager中ProcessState::self()->startThreadPool();//啟動緩沖池IPCThreadState::self()->joinThreadPool();//這里是把服務添加到Binder閉合循環進程中 }
以上為底層服務的標準操作。
下面是這個服務?Android.mk:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_SRC_FILES += \testserver.cppLOCAL_SHARED_LIBRARIES := \libTest \libutils \libbinder LOCAL_MODULE := addserver include $(BUILD_EXECUTABLE)
退出后當前目錄執行?mm即可在?out目錄的?system/bin下產出?addserver可執行文件。
實現服務進程開機自動運行
進入到?/android/system/core/rootdir/目錄中有個?init.rc文件
vi init.rc
在?service中添加
service addservice????/system/bin/addserver????//將?/system/bin/addserver作為一個服務啟動,服務的名稱為?addservice(這個不重要)。
?
最后退出到?android/目錄下執行全編譯:
輸入?. build/envsetup.sh
Lunch
Make
完成之后
Emulator打開模擬器
打開另一個?shell終端?輸入?adb shell????進入模擬器模式??????如果?adbshell系統提示沒有發現該命令?就在?android/out/host/linux-x86/bin/中輸入???./adb shell??
在輸入?ps??查看進程???找到是否有?addserver進程
如果有就成功一半。
測試我們的服務
隨便在?app中?建立一個簡單的應用程序,
這里可以直接在?eclipse?中建立好工程?拷貝到?android/packages/apps?中,然后為應用添加一個?Android.mk?文件,可以從其他應用中拷貝來修改。
在應用程序中測試服務的代碼:
package cn.toltech.testserver;import android.app.Activity; import android.os.Bundle; import android.os.IBinder; import android.os.Parcel; import android.util.Log; import android.os.Process;public class TestServerActivity extends Activity {private static final String TAG = null;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}private void test(){try{IBinder binder = ServiceManager.getService("joben.add");// 取得服務Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();if(binder == null)Log.d(TAG,"failed to get service");data.writeInt(Process.myPid());// 固定操作data.writeInt(100);// 傳入參數binder.transact(0, data, reply, 0);// 執行遠程調用Log.d(TAG,"result="+reply.readInt());// 驗證結果}catch(Exception e){Log.d(TAG,e.toString());}} }總結
以上是生活随笔為你收集整理的Android4.0添加底层核心服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android4.0 SystemUi系
- 下一篇: Android4.0添加java层服务