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
- #ifndefANDROID_ADD_SERVICE_H
- #defineANDROID_ADD_SERVICE_H
- #include<utils/RefBase.h>
- #include<binder/IInterface.h>
- #include<binder/Parcel.h>
- #include<utils/threads.h>
- namespaceandroid{
- classAddService:publicBBinder{//从BBinder派生,实现本地接口
- mutableMutexmLock;
- int32_tmNextConnId;
- public:
- staticintinstantiate();
- AddService();
- virtual~AddService();
- virtualstatus_tonTransact(uint32_t,constParcel&,Parcel*,uint32_t);
- };
- };//namespace
- #endif
AddService.c
[cpp] view plain copy
- #include"AddService.h"
- #include<binder/IServiceManager.h>
- #include<binder/IPCThreadState.h>
- namespaceandroid{
- staticstructsigactionoldact;
- staticpthread_key_tsigbuskey;
- //把自己注册到系统中
- intAddService::instantiate(){
- LOGE("*******AddServiceinstantiate.*********");
- intr=defaultServiceManager()->addService(String16("zhang"),newAddService());
- LOGE("********AddServicer=%d\n",r);
- returnr;
- }
- //构造函数
- AddService::AddService()
- {
- LOGV("******AddServicecreated.********");
- mNextConnId=1;
- pthread_key_create(&sigbuskey,NULL);
- }
- //析构函数
- AddService::~AddService()
- {
- pthread_key_delete(sigbuskey);
- LOGV("******AddServicedestroyed.*******");
- }
- status_tAddService::onTransact(uint32_tcode,constParcel&data,Parcel*reply,uint32_tflags)
- {
- switch(code){//根据不同的code执行不同操作
- case0:{
- pid_tpid=data.readInt32();
- intnum=data.readInt32();
- num=num+10000;
- reply->writeInt32(num);
- returnNO_ERROR;
- break;
- }
- default:{
- break;
- }
- }
- returnBBinder::onTransact(code,data,reply,flags);
- }
- };
注意在AddService::Instantiate()中调用defaultServiceManager()->addService("zhang",new AddService()),在服务总管ServiceManager中注册了名字为"zhang"的服务。在应用层取得该服务的句柄用ServiceManger.getService("zhang")来实现的。ServiceManager根据名字返回给客户端相应的服务,如果找不到该名字对应的服务,则返回空。
[cpp] view plain copyAndroid.mk
[cpp] view plain copy
- LOCAL_PATH:=$(callmy-dir)
- include$(CLEAR_VARS)
- LOCAL_MODULE_TAGS:=optional
- LOCAL_SRC_FILES:=AddService.cpp
- LOCAL_C_INCLUDES:=$(JNI_H_INCLUDE)
- LOCAL_SHARED_LIBRARIES:=\
- libcutils\
- libutils\
- libbinder\
- libandroid_runtime
- LOCAL_PRELINK_MODULE:=false
- LOCAL_MODULE:=libAdd
- include$(BUILD_SHARED_LIBRARY)
编译 mmm frameworks/base/addservice/libaddservice/
生成libAdd.so库文件
[html] view plain copy
- make:进入目录'/home/zhangfang/zf/DM3730/source/android_source/TI_Android_GingerBread_2_3_4Sources'
- targetthumbC++:libAdd<=frameworks/base/addservice/libaddservice/AddService.cpp
- targetSharedLib:libAdd(out/target/product/omap3evm/obj/SHARED_LIBRARIES/libAdd_intermediates/LINKED/libAdd.so)
- targetNon-prelinked:libAdd(out/target/product/omap3evm/symbols/system/lib/libAdd.so)
- targetStrip:libAdd(out/target/product/omap3evm/obj/lib/libAdd.so)
- Install:out/target/product/omap3evm/system/lib/libAdd.so
3、编写可执行程序
cd addserver
vi addserver.cpp
[cpp] view plain copy
- #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"../libaddservice/AddService.h"
- usingnamespaceandroid;
- intmain(intargc,char**argv)
- {
- sp<ProcessState>proc(ProcessState::self());
- sp<IServiceManager>sm=defaultServiceManager();
- LOGV("*********AddServer*******:ServiceManager:%p",sm.get());
- AddService::instantiate();//把自己添加到ServiceManager中去
- ProcessState::self()->startThreadPool();
- IPCThreadState::self()->joinThreadPool();
- }
Android.mk
[cpp] view plain copy
- LOCAL_PATH:=$(callmy-dir)
- include$(CLEAR_VARS)
- LOCAL_MODULE_TAGS:=optional
- LOCAL_SRC_FILES:=addserver.cpp
- LOCAL_SHARED_LIBRARIES:=libAdd\
- libutils\
- libbinder
- LOCAL_MODULE:=addserver
- include$(BUILD_EXECUTABLE)
编译:mmm frameworks/base/addservice/addserver/
生成可执行文件addserver.
[html] view plain copy
- make:进入目录'/home/zhangfang/zf/DM3730/source/android_source/TI_Android_GingerBread_2_3_4Sources'
- targetthumbC++:addserver<=frameworks/base/addservice/addserver/addserver.cpp
- targetExecutable:addserver(out/target/product/omap3evm/obj/EXECUTABLES/addserver_intermediates/LINKED/addserver)
- targetNon-prelinked:addserver(out/target/product/omap3evm/symbols/system/bin/addserver)
- targetStrip:addserver(out/target/product/omap3evm/obj/EXECUTABLES/addserver_intermediates/addserver)
- 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
- #serviceaddserviceisatest
- serviceaddserver_zhang/system/bin/addserver
这里的名字addserver_zhang不重要,方便自己识别而已,可随便写。
5、重新开机,执行ps看是否该服务已成功启动。
[cpp] view plain copy
- ps
- 113100:00/system/bin/addserver
若能查询到addserver,则表名服务启动成功。
注意:查询不到,检查addserver是否写成addservice了。
6、编写应用程序测试该服务
[java] view plain copy
- packagecom.add.service;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.os.IBinder;
- importandroid.os.Parcel;
- importandroid.os.Process;
- importandroid.util.Log;
- importandroid.os.ServiceManager;
- publicclassDM3730ADDServiceActivityextendsActivity{
- privatestaticfinalStringTag="com.add.service.test";
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- test();
- }
- privatevoidtest()
- {
- try{
- IBinderbinder=ServiceManager.getService("zhang");
- Parceldata=Parcel.obtain();
- Parcelreply=Parcel.obtain();
- if(binder==null){
- Log.d(Tag,"failedtogetService.");
- }
- data.writeInt(Process.myPid());
- data.writeInt(100);
- binder.transact(0,data,reply,0);//执行远程调用
- Log.d(Tag,"result="+reply.readInt());//验证结果
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }
android.mk
[html] view plain copy
- LOCAL_PATH:=$(callmy-dir)
- include$(CLEAR_VARS)
- LOCAL_MODULE_TAGS:=optional
- LOCAL_SRC_FILES:=$(callall-subdir-java-files)
- LOCAL_PACKAGE_NAME:=AddServiceTest
- include$(BUILD_PACKAGE)
编译之后生成 AddServiceTest.apk
进行安装,查看log
logcat
[html] view plain copy
- 调用成功
- I/ActivityManager(1236):Startproccom.add.serviceforactivitycom.add.service/.DM3730ADDServiceActivity:pid=2104uid=10034gids={}
- D/com.add.service.test(2104):result=10100
- I/ActivityMana
更多相关文章
- android下的回调方法
- Android面试基础(三)——四大组件的介绍
- Android(安卓)Studio如何导入android源码
- Android开发学习笔记2---HelloWord安卓程序结构简介
- 原生Android应用中内嵌RN
- audio的输出设备切换分析
- Android(安卓)unZip
- NDK使用log的问题
- android webview 加载本地文件