转自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. #ifndefANDROID_ADD_SERVICE_H
  2. #defineANDROID_ADD_SERVICE_H
  3. #include<utils/RefBase.h>
  4. #include<binder/IInterface.h>
  5. #include<binder/Parcel.h>
  6. #include<utils/threads.h>
  7. namespaceandroid{
  8. classAddService:publicBBinder{//从BBinder派生,实现本地接口
  9. mutableMutexmLock;
  10. int32_tmNextConnId;
  11. public:
  12. staticintinstantiate();
  13. AddService();
  14. virtual~AddService();
  15. virtualstatus_tonTransact(uint32_t,constParcel&,Parcel*,uint32_t);
  16. };
  17. };//namespace
  18. #endif

AddService.c

[cpp] view plain copy
  1. #include"AddService.h"
  2. #include<binder/IServiceManager.h>
  3. #include<binder/IPCThreadState.h>
  4. namespaceandroid{
  5. staticstructsigactionoldact;
  6. staticpthread_key_tsigbuskey;
  7. //把自己注册到系统中
  8. intAddService::instantiate(){
  9. LOGE("*******AddServiceinstantiate.*********");
  10. intr=defaultServiceManager()->addService(String16("zhang"),newAddService());
  11. LOGE("********AddServicer=%d\n",r);
  12. returnr;
  13. }
  14. //构造函数
  15. AddService::AddService()
  16. {
  17. LOGV("******AddServicecreated.********");
  18. mNextConnId=1;
  19. pthread_key_create(&sigbuskey,NULL);
  20. }
  21. //析构函数
  22. AddService::~AddService()
  23. {
  24. pthread_key_delete(sigbuskey);
  25. LOGV("******AddServicedestroyed.*******");
  26. }
  27. status_tAddService::onTransact(uint32_tcode,constParcel&data,Parcel*reply,uint32_tflags)
  28. {
  29. switch(code){//根据不同的code执行不同操作
  30. case0:{
  31. pid_tpid=data.readInt32();
  32. intnum=data.readInt32();
  33. num=num+10000;
  34. reply->writeInt32(num);
  35. returnNO_ERROR;
  36. break;
  37. }
  38. default:{
  39. break;
  40. }
  41. }
  42. returnBBinder::onTransact(code,data,reply,flags);
  43. }
  44. };

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

[cpp] view plain copy

Android.mk

[cpp] view plain copy
  1. LOCAL_PATH:=$(callmy-dir)
  2. include$(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS:=optional
  4. LOCAL_SRC_FILES:=AddService.cpp
  5. LOCAL_C_INCLUDES:=$(JNI_H_INCLUDE)
  6. LOCAL_SHARED_LIBRARIES:=\
  7. libcutils\
  8. libutils\
  9. libbinder\
  10. libandroid_runtime
  11. LOCAL_PRELINK_MODULE:=false
  12. LOCAL_MODULE:=libAdd
  13. 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. targetthumbC++:libAdd<=frameworks/base/addservice/libaddservice/AddService.cpp
  3. targetSharedLib:libAdd(out/target/product/omap3evm/obj/SHARED_LIBRARIES/libAdd_intermediates/LINKED/libAdd.so)
  4. targetNon-prelinked:libAdd(out/target/product/omap3evm/symbols/system/lib/libAdd.so)
  5. targetStrip: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. usingnamespaceandroid;
  11. intmain(intargc,char**argv)
  12. {
  13. sp<ProcessState>proc(ProcessState::self());
  14. sp<IServiceManager>sm=defaultServiceManager();
  15. LOGV("*********AddServer*******:ServiceManager:%p",sm.get());
  16. AddService::instantiate();//把自己添加到ServiceManager中去
  17. ProcessState::self()->startThreadPool();
  18. IPCThreadState::self()->joinThreadPool();
  19. }
关键是调用AddService::instantiate()把AddService服务注册进ServiceManager中。其他实现android都把它封装好了,与其他类型服务相同。参照:MediaPlayServer的实现。
Android.mk

[cpp] view plain copy
  1. LOCAL_PATH:=$(callmy-dir)
  2. include$(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS:=optional
  4. LOCAL_SRC_FILES:=addserver.cpp
  5. LOCAL_SHARED_LIBRARIES:=libAdd\
  6. libutils\
  7. libbinder
  8. LOCAL_MODULE:=addserver
  9. 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. targetthumbC++:addserver<=frameworks/base/addservice/addserver/addserver.cpp
  3. targetExecutable:addserver(out/target/product/omap3evm/obj/EXECUTABLES/addserver_intermediates/LINKED/addserver)
  4. targetNon-prelinked:addserver(out/target/product/omap3evm/symbols/system/bin/addserver)
  5. targetStrip: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. #serviceaddserviceisatest
  2. serviceaddserver_zhang/system/bin/addserver

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


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

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

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

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


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

[java] view plain copy
  1. packagecom.add.service;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.os.IBinder;
  5. importandroid.os.Parcel;
  6. importandroid.os.Process;
  7. importandroid.util.Log;
  8. importandroid.os.ServiceManager;
  9. publicclassDM3730ADDServiceActivityextendsActivity{
  10. privatestaticfinalStringTag="com.add.service.test";
  11. /**Calledwhentheactivityisfirstcreated.*/
  12. @Override
  13. publicvoidonCreate(BundlesavedInstanceState){
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.main);
  16. test();
  17. }
  18. privatevoidtest()
  19. {
  20. try{
  21. IBinderbinder=ServiceManager.getService("zhang");
  22. Parceldata=Parcel.obtain();
  23. Parcelreply=Parcel.obtain();
  24. if(binder==null){
  25. Log.d(Tag,"failedtogetService.");
  26. }
  27. data.writeInt(Process.myPid());
  28. data.writeInt(100);
  29. binder.transact(0,data,reply,0);//执行远程调用
  30. Log.d(Tag,"result="+reply.readInt());//验证结果
  31. }catch(Exceptione){
  32. e.printStackTrace();
  33. }
  34. }
  35. }
注:本应该在framwork层添加一个java层的service,把这些具体的实现封装起来,在App层就只有调用write(),read()就好了,这里只是简单的测试而已。
android.mk

[html] view plain copy
  1. LOCAL_PATH:=$(callmy-dir)
  2. include$(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS:=optional
  4. LOCAL_SRC_FILES:=$(callall-subdir-java-files)
  5. LOCAL_PACKAGE_NAME:=AddServiceTest
  6. include$(BUILD_PACKAGE)

编译之后生成 AddServiceTest.apk

进行安装,查看log

logcat

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

更多相关文章

  1. android下的回调方法
  2. Android面试基础(三)——四大组件的介绍
  3. Android(安卓)Studio如何导入android源码
  4. Android开发学习笔记2---HelloWord安卓程序结构简介
  5. 原生Android应用中内嵌RN
  6. audio的输出设备切换分析
  7. Android(安卓)unZip
  8. NDK使用log的问题
  9. android webview 加载本地文件

随机推荐

  1. android之组件2
  2. Android监听网络变化 二
  3. 安卓学习资料推荐
  4. Android(安卓)SharedPreferences 存储复
  5. 利用Android(安卓)Studio、MAT对Android
  6. 关于Android的nodpi,xhdpi,hdpi,mdpi,ldp
  7. Android简明开发教程九:创建应用程序框架
  8. 面试题
  9. android studio for android learning (九
  10. Android之SlidingDrawer抽屉效果