为Android添加核心层服务.doc_第1页
为Android添加核心层服务.doc_第2页
为Android添加核心层服务.doc_第3页
为Android添加核心层服务.doc_第4页
为Android添加核心层服务.doc_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

为Android添加底层核心服务1. 为什么要写底层核心服务呢? 因为底层核心服务是Android框架里最接近Linux/Driver的部分。为了充分发挥硬件设备的差异化特性,核心服务是让上层Java应用程序来使用Driver/HW Device 特色的重要管道。例如Media、Telephone等底层硬件。 在开机过程中,就可以启动核心服务(汉字输入法服务等),让众多应用程序来共同使用。由于共用,所以能有效降低Java应用程序的大小(Size)。2. 核心服务与Java 层的Service有何区别和关系? Android具有两层服务 -Java层SDK-based Service -C+层的Code Service 以MediaPlayer为例,说明两种服务的关系如下图:3. 编写自己的核心服务(C+层)1).要点核心服务通常在独立的进程(Process)里执行。必须提供IBinder接口,让应用程序可以进行跨进程的绑定(Binding)和调用。因为共用,所以必须确保多线程安全(Thread-safe)。使用C+来实现,并调用IServiceManager:addService()函数添加到系统的Binder Driver里。上层应用程序通过ServiceManager获取该服务。上层应用程序通过IBinder:transact()函数来与核心服进行数据交互。2).添加服务下面详细介绍如何添加一个底层服务到系统中,假设服务名为AddService,其用途是对传入的参数加上1000,并返回结果。服务实现进入android源码的目录frameworks/base,在该目录下建立自己的目录,假设为addservice,再在这个目录中建立两个子目录addserver和libaddservice,addserver用于存放服务的启动文件,其最终的生成为可执行文件,在系统启动的时候运行,libaddservice用于存放服务的实现文件,最终会生成动态链接库,有addserver调用。首先,服务的实现文件包括两个文件,AddService.h和AddService.cpp,以下是AddService.h:#ifndef ANDROID_GUILH_ADD_SERVICE_H#define ANDROID_GUILH_ADD_SERVICE_H#include #include #include #include namespace android class AddService : public BBinder/从BBinder派生,实现本地接口 mutable Mutex mLock; int32_t mNextConnId; public: static int instantiate(); AddService(); virtual AddService(); virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t); ; /namespace#endif然后是服务的实现文件AddService.cpp:#include AddService.h#include #include namespace android static struct sigaction oldact;static pthread_key_t sigbuskey;/把自己注册到系统中int AddService:instantiate() LOGE(AddService instantiate);int r = defaultServiceManager()-addService(String16(guilh.add), new AddService();/这里主要是把/AddSerice这个服务添加到Binder Driver中服务名为guilh.addLOGE(AddService r = %dn, r);return r;/构造函数AddService:AddService() LOGV(AddService created);mNextConnId = 1;pthread_key_create(&sigbuskey, NULL);/析构函数AddService:AddService()pthread_key_delete(sigbuskey);LOGV(AddService destroyed);/这个是服务具体的本地实现,功能实现都应该放在这里面,通过传入执行代码(code)/的不同来执行不同的操作,上层隐射为不同的api。status_t AddService:onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)switch(code) case 0: /根据code的不同执行不同的操作pid_t pid = data.readInt32();int num = data.readInt32();num = num + 1000;reply-writeInt32(num);return NO_ERROR;break;default:return BBinder:onTransact(code, data, reply, flags); /namespace以下是编译服务的Android.mk,和上面的cpp放在一起。LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:= AddService.cppLOCAL_C_INCLUDES := $(JNI_H_INCLUDE)LOCAL_SHARED_LIBRARIES := libcutils libutils libbinder libandroid_runtimeLOCAL_PRELINK_MODULE := falseLOCAL_MODULE := libAddinclude $(BUILD_SHARED_LIBRARY) #这一行表示编译为动态库在命令行中退出到android/目录级 加载编译环境 . build/envsetup.sh 然后lunch。 然后在cd /android/frameworks/base/addservice/libaddservice/目录 输入mm之后在out目录产出 libAdd.so文件。在此 完成核心服务第一步。服务进程实现进入到cd /android/frameworks/base/addservice/addserver/目录增加一个文件 addserver.cpp,文件内容如下:#include #include #include #include #include #include #include #include #include ./libaddservice/AddService.h/#include using namespace android;int main(int argc, char* argv)sp proc(ProcessState:self();sp sm = defaultServiceManager();/取得ServiceManagerLOGI(ServiceManager: %p, sm.get();AddService:instantiate();/把自己添加到ServiceManager中ProcessState:self()-startThreadPool();/启动缓冲池IPCThreadState:self()-joinThreadPool();/这里是把服务添加到Binder闭合循环进程中以上为底层服务的标准操作。下面是这个服务makefile:include $(CLEAR_VARS)LOCAL_SRC_FILES:= addserver.cppLOCAL_SHARED_LIBRARIES := libAdd libutils libbinderLOCAL_MODULE:= addserverinclude $(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.shLunchMake完成之后Emulator打开模拟器打开另一个shell终端 输入adb shell 进入模拟器模式 如果adbshell系统提示没有发现该命令 就在android/out/host/linux-x86/bin/中输入 ./adb shell 在输入ps 查看进程 找到是否有addserver进程如果有就成功一半。如下图测试我们的服务随便在android/packages/apps中建立一个简单的应用程序,这里可以直接在eclipse中建立好工程 拷贝到android/packages/apps中,然后为应用添加一个Android.mk文件,可以从其他应用中拷贝来修改。在应用程序中测试服务的代码: private void test() try IBinder binder = ServiceManager.getService(guilh.add);/取得服务 Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); if(binder = null) Log.d(TAG,failed to get service); data.w

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论