android 添加核心层服务

转自http://blog.csdn.net/zfzf294990051/article/details/7361081 


本文为前篇 为android添加核心服务的具体实现

实现功能:添加一个底层服务到系统中,该服务名为AddService,实现对传入参数加10000的操作。

1、创建一系列文件夹

cd framework/base

mkdir addservice

cd addservice

mkdir addserver    存放服务的启动程序文件,最终生成为可执行文件

mkdir libaddservice  存放服务动态链接库文件,最后生成一个动态链接库,供可执行程序使用。


2、编写动态库文件,服务的具体实现文件

cd libaddservice

AddService.h

[cpp]  view plain copy
  1. #ifndef ANDROID_ADD_SERVICE_H  
  2. #define ANDROID_ADD_SERVICE_H  
  3.   
  4. #include <utils/RefBase.h>  
  5. #include <binder/IInterface.h>  
  6. #include <binder/Parcel.h>  
  7. #include <utils/threads.h>  
  8.   
  9.   
  10. namespace android{  
  11.         class AddService : public BBinder { //从BBinder派生,实现本地接口  
  12.         mutable Mutex mLock;  
  13.         int32_t mNextConnId;  
  14.         public:  
  15.                 static int instantiate();  
  16.                 AddService();  
  17.                 virtual ~AddService();  
  18.                 virtual status_t onTransact(uint32_t,const Parcel&,Parcel*,uint32_t);  
  19.         };  
  20. };//namespace  
  21.   
  22. #endif  

AddService.c

[cpp]  view plain copy
  1. #include "AddService.h"  
  2. #include <binder/IServiceManager.h>  
  3. #include <binder/IPCThreadState.h>  
  4.   
  5. namespace android{  
  6.         static struct sigaction oldact;  
  7.         static pthread_key_t sigbuskey;  
  8.   
  9.         //把自己注册到系统中  
  10.         int AddService::instantiate(){  
  11.                 LOGE("*******AddService instantiate.*********");  
  12.                 int r = defaultServiceManager()->addService(String16("zhang"),new AddService());  
  13.                 LOGE("********AddService r = %d\n",r);  
  14.                 return r;  
  15.         }  
  16.   
  17.         //构造函数  
  18.         AddService::AddService()  
  19.         {  
  20.                 LOGV("******AddService created.********");  
  21.                 mNextConnId = 1;  
  22.                 pthread_key_create(&sigbuskey,NULL);  
  23.         }  
  24.         //析构函数  
  25.         AddService::~AddService()  
  26.         {  
  27.                 pthread_key_delete(sigbuskey);  
  28.                 LOGV("******AddService destroyed.*******");  
  29.         }  
  30.   
  31.         status_t AddService::onTransact(uint32_t code,const Parcel& data,Parcel*reply,uint32_t flags)  
  32.         {  
  33.                 switch(code){//根据不同的code执行不同操作  
  34.                         case 0:{  
  35.                                 pid_t pid = data.readInt32();  
  36.                                 int num = data.readInt32();  
  37.                                 num = num+10000;  
  38.                                 reply->writeInt32(num);  
  39.                                 return NO_ERROR;  
  40.                                 break;  
  41.                         }  
  42.                         default:{  
  43.                                 break;  
  44.                         }  
  45.                 }  
  46.                 return BBinder::onTransact(code,data,reply,flags);  
  47.         }  
  48. };  

注意在AddService::Instantiate()中调用defaultServiceManager()->addService("zhang",new AddService()),在服务总管ServiceManager中注册了名字为"zhang"的服务。在应用层取得该服务的句柄用ServiceManger.getService("zhang")来实现的。ServiceManager根据名字返回给客户端相应的服务,如果找不到该名字对应的服务,则返回空。

[cpp]  view plain copy
  1.   

Android.mk

[cpp]  view plain copy
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE_TAGS := optional  
  6.   
  7. LOCAL_SRC_FILES := AddService.cpp  
  8.   
  9. LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)  
  10.   
  11. LOCAL_SHARED_LIBRARIES := \  
  12.                         libcutils \  
  13.                         libutils  \  
  14.                         libbinder \  
  15.                         libandroid_runtime  
  16.   
  17. LOCAL_PRELINK_MODULE := false  
  18.   
  19. LOCAL_MODULE := libAdd  
  20.   
  21. include $(BUILD_SHARED_LIBRARY)  

编译 mmm frameworks/base/addservice/libaddservice/

生成libAdd.so库文件

[html]  view plain copy
  1. make:进入目录'/home/zhangfang/zf/DM3730/source/android_source/TI_Android_GingerBread_2_3_4Sources'  
  2. target thumb C++: libAdd <= frameworks/base/addservice/libaddservice/AddService.cpp  
  3. target SharedLib: libAdd (out/target/product/omap3evm/obj/SHARED_LIBRARIES/libAdd_intermediates/LINKED/libAdd.so)  
  4. target Non-prelinked: libAdd (out/target/product/omap3evm/symbols/system/lib/libAdd.so)  
  5. target Strip: libAdd (out/target/product/omap3evm/obj/lib/libAdd.so)  
  6. Install: out/target/product/omap3evm/system/lib/libAdd.so  


3、编写可执行程序

cd addserver

vi addserver.cpp

[cpp]  view plain copy
  1. #include <sys/types.h>  
  2. #include <unistd.h>  
  3. #include <grp.h>  
  4. #include <binder/IPCThreadState.h>  
  5. #include <binder/ProcessState.h>  
  6. #include <binder/IServiceManager.h>  
  7. #include <utils/Log.h>  
  8. #include <private/android_filesystem_config.h>  
  9. #include "../libaddservice/AddService.h"  
  10.   
  11. using namespace android;  
  12.   
  13. int main(int argc,char **argv)  
  14. {  
  15.         sp<ProcessState> proc(ProcessState::self());  
  16.         sp<IServiceManager> sm = defaultServiceManager();  
  17.         LOGV("*********AddServer*******: ServiceManager:%p",sm.get());  
  18.         AddService::instantiate();//把自己添加到ServiceManager中去  
  19.         ProcessState::self()->startThreadPool();  
  20.         IPCThreadState::self()->joinThreadPool();  
  21. }  
关键是调用AddService::instantiate()把AddService服务注册进ServiceManager中。其他实现android都把它封装好了,与其他类型服务相同。参照:MediaPlayServer的实现。
Android.mk

[cpp]  view plain copy
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE_TAGS := optional  
  6.   
  7. LOCAL_SRC_FILES := addserver.cpp  
  8.   
  9. LOCAL_SHARED_LIBRARIES := libAdd \  
  10.                         libutils \  
  11.                         libbinder  
  12.   
  13. LOCAL_MODULE := addserver  
  14.   
  15. include $(BUILD_EXECUTABLE)  

编译:mmm frameworks/base/addservice/addserver/

生成可执行文件addserver.

[html]  view plain copy
  1. make:进入目录'/home/zhangfang/zf/DM3730/source/android_source/TI_Android_GingerBread_2_3_4Sources'  
  2. target thumb C++: addserver <= frameworks/base/addservice/addserver/addserver.cpp  
  3. target Executable: addserver (out/target/product/omap3evm/obj/EXECUTABLES/addserver_intermediates/LINKED/addserver)  
  4. target Non-prelinked: addserver (out/target/product/omap3evm/symbols/system/bin/addserver)  
  5. target Strip: addserver (out/target/product/omap3evm/obj/EXECUTABLES/addserver_intermediates/addserver)  
  6. Install: out/target/product/omap3evm/system/bin/addserver  


4、把生成的可执行文件addserver 和动态链接库文件libAdd.so拷贝到卡发版/system/bin和/system/lib目录(模拟器上相当于make snod.)

修改启动脚本init.rc文件,使之在开机是启动服务addserver

[cpp]  view plain copy
  1. #service addservice is a test  
  2. service addserver_zhang /system/bin/addserver  

这里的名字addserver_zhang不重要,方便自己识别而已,可随便写。


5、重新开机,执行ps看是否该服务已成功启动。

[cpp]  view plain copy
  1. ps  
  2.   
  3. 1131 0          0:00 /system/bin/addserver  

若能查询到addserver,则表名服务启动成功。

注意:查询不到,检查addserver是否写成addservice了。


6、编写应用程序测试该服务

[java]  view plain copy
  1. package com.add.service;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.IBinder;  
  6. import android.os.Parcel;  
  7. import android.os.Process;  
  8. import android.util.Log;  
  9. import android.os.ServiceManager;  
  10.   
  11. public class DM3730ADDServiceActivity extends Activity {  
  12.     private static final String Tag = "com.add.service.test";  
  13.     /** Called when the activity is first created. */  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.           
  19.         test();  
  20.     }  
  21.     private void test()  
  22.     {  
  23.         try{  
  24.             IBinder binder = ServiceManager.getService("zhang");  
  25.             Parcel data = Parcel.obtain();  
  26.             Parcel reply = Parcel.obtain();  
  27.             if(binder == null){  
  28.                 Log.d(Tag, "failed to get Service.");  
  29.             }  
  30.             data.writeInt(Process.myPid());  
  31.             data.writeInt(100);  
  32.             binder.transact(0, data, reply, 0);//执行远程调用  
  33.             Log.d(Tag, "result = "+reply.readInt());//验证结果  
  34.         }catch(Exception e){  
  35.             e.printStackTrace();  
  36.         }  
  37.     }  
  38. }  
注:本应该在framwork层添加一个java层的service,把这些具体的实现封装起来,在App层就只有调用write(),read()就好了,这里只是简单的测试而已。
android.mk

[html]  view plain copy
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE_TAGS :optional  
  6.   
  7. LOCAL_SRC_FILES := $(call all-subdir-java-files)  
  8.   
  9. LOCAL_PACKAGE_NAME :AddServiceTest  
  10.   
  11. include $(BUILD_PACKAGE)  

编译之后生成 AddServiceTest.apk

进行安装,查看log

logcat

[html]  view plain copy
  1. 调用成功  
  2. I/ActivityManager( 1236): Start proc com.add.service for activity com.add.service/.DM3730ADDServiceActivity: pid=2104 uid=10034 gids={}  
  3. D/com.add.service.test( 2104): result = 10100  
  4. I/ActivityMana

你可能感兴趣的:(android 添加核心层服务)