- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
为Android添加核心层服务.doc
为Android添加底层核心服务
为什么要写底层核心服务呢?
因为底层核心服务是Android框架里最接近Linux/Driver的部分。为了充分发挥硬件设备的差异化特性,核心服务是让上层Java应用程序来使用Driver/HW Device 特色的重要管道。例如Media、Telephone等底层硬件。
在开机过程中,就可以启动核心服务(汉字输入法服务等),让众多应用程序来共同使用。
由于共用,所以能有效降低Java应用程序的大小(Size)。
核心服务与Java 层的Service有何区别和关系?
Android具有两层服务
--Java层SDK-based Service
--C++层的Code Service
以MediaPlayer为例,说明两种服务的关系如下图:
编写自己的核心服务(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 utils/RefBase.h
#include binder/IInterface.h
#include binder/Parcel.h
#include utils/threads.h
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 binder/IServiceManager.h
#include binder/IPCThreadState.h
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.add
LOGE(Add
文档评论(0)