`
quanminchaoren
  • 浏览: 911299 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android 添加底层核心服务

阅读更多

 Android添加底层核心服务

1.      为什么要写底层核心服务呢?

          因为底层核心服务是  Android框架里最接近  Linux/Driver的部分。为了充分发挥硬件设备的差异化特性,核心服务是让上层  Java应用程序来使用  Driver/HW Device 特色的重要管道。例如  Media  Telephone等底层硬件。

        在开机过程中,就可以启动核心服务(汉字输入法服务等),让众多应用程序来共同使用。

由于共用,所以能有效降低  Java应用程序的大小(  Size)。

2.      核心服务与  Java 层的  Service有何区别和关系?

        Android具有两层服务

              --Java  SDK-based Service

              --C++层的  Code Service

    


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 <utils/RefBase.h>

#include <binder/IInterface.h>

#include <binder/Parcel.h>

#include <utils/threads.h>

 

namespace android {

         class AddService : public BBinder{//     BBinder   派生,实现本地接口

        

                 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("AddService r = %d/n", 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.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)    #这一行表示编译为动态库

 

在命令行中退出到  android/目录级  加载编译环境  . build/envsetup.sh

然后  lunch

然后在   cd   /android/frameworks/base/addservice/   libaddservice/   目录   输入   mm

之后在   out   目录产出   libAdd.so   文件。

在此   完成核心服务第一步。

 

服务进程实现

                 进入到  cd   /android/frameworks/base/addservice/addserver/   目录

增加一个文件   addserver.cpp   ,文件内容如下:

 

#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"

//#include <libadd/AddService.h>

using namespace android;

int main(int argc, char** argv)

{

sp<ProcessState> proc(ProcessState::self());

sp<IServiceManager> sm = defaultServiceManager();//取得  ServiceManager

LOGI("ServiceManager: %p", sm.get());

AddService::instantiate();//把自己添加到  ServiceManager

ProcessState::self()->startThreadPool();//启动缓冲池

IPCThreadState::self()->joinThreadPool();//这里是把服务添加到  Binder闭合循环进程中

}

以上为底层服务的标准操作。

下面是这个服务  makefile

include $(CLEAR_VARS)

 

LOCAL_SRC_FILES:= /

         addserver.cpp

 

LOCAL_SHARED_LIBRARIES := /

         libAdd /

         libutils /

         libbinder

LOCAL_MODULE:= addserver

include $(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.sh

Lunch

Make

完成之后

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.writeInt(Process.myPid());//  固定操作

                         data.writeInt(100);//  传入参数

                         binder.transact(0, data, reply, 0);//  执行远程调用

                         Log.d(TAG,"result="+reply.readInt());//   验证结果

                 }catch(Exception e){

                           Log.d(TAG,e.toString());

                 }

分享到:
评论

相关推荐

    新版Android开发教程.rar

    ANDROID 的推出后可能影响的产业包括移动电信业,软件开发业,手机制造业,在以消费者为核心的状 态 。 对消费者的影响 � 高档手机选择面增加。 � A ndroid 在设计初期就考虑了与现其有业务的融合,改变以往从...

    Android传感器开发与智能设备案例实战

    共29章,主要包括Android开发技术基础、获取并编译源码、Android技术核心框架分析、Android传感器系统分析、使用地图定位、光线传感器详解、接近警报传感器详解、磁场传感器详解、加速度传感器详解、方向传感器详解...

    android开发资料大全

    Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程 Android应用开发者指南:性能优化 android开发教程合集(推荐新手看下这一季教程) 新手入门 会员贡献电子图书整理(内含PDF下载) ...

    android-framework-hal

    应用到底层的层次结构 9.2 media核心库的结构 多媒体本地代码的结构 9.3 多媒体部分的上层代码 照相机,媒体播放,媒体录制的框架结构 9.4 PackageVideo的架构 OpenMAX编译码插件的集成 9.5 stagefright...

    Android应用程序开发教程PDF电子书完整版、Android开发学习教程

    Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型 。 Linux 内核也同时作为硬件和软件栈之间的抽象层。 5 建立 Android Android Android Android 开发环境 ① ...

    优看PDFSDK For Android(含源码)

    此外,我们还提供基于以上核心技术的定制开发服务,开发人员可通过所提供的示例代码快速上手,更专注于程序开发而不是PDF及TXT,让您的应用快速投入市场。 以下简单介绍优看PDFSDK For Android在Android平台上的具体...

    Android自主学习项目报告(一).doc

    自己在学习过程中总结的知识点 (3)Android体系结构和Android项目目录 Android是基于Linux内核的软件平台和操作系统,采用了软件堆栈的架构,共分为4 层:第一层是Linux内核,提供由操作系统内核管理的底层基础功能...

    【视频3】Android Studio安裝.avi

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    【视频1】移动应用开发-android课程介绍

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    8天快速掌握Android教程源码

    视频名称 源码 ----------------------...复杂UI界面设计、GPS与GoogleMap、自定义View、Ubuntu Linux下使用C语言面向底层开发、通过JNI进行底层组件调用、图形与OpenGl ES、界面特效、下载修改及编绎Android框架代码。

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...

    android平台基于openCV人脸检测,添加宠萌效果.zip

    跨平台:OpenCV支持多种操作系统,包括但不限于Windows、Linux、macOS、Android和iOS,确保代码能够在不同平台上无缝运行。 丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像...

    Android 3D游戏开发技术宝典-OpenGL ES 2.0 (吴亚峰) 源代码

    1.5.5 底层linux内核 21 1.6 本章小结 22 第2章 游戏开发相关android基础知识 23 2.1 游戏中的音效 23 2.1.1 游戏中的即时音效 23 2.1.2 即时音效的一个案例 24 2.1.3 背景音乐播放技术 27 ...

    【视频2】移动应用开发-JDK安装

    1.本套课程包括Android的核心UI界面设计和后端代码实现,将内容显示在UI界面中。 2.重要涉及UI界面多种点击事件,数据获取,列表,网络接口请求数据,多线程,Handler数据传递,Json数据解析及LitePal数据库使用。 3...

    指纹识别算法练习,基于FVC2004数据库,Qt平台开发,核心C语言实现.zip

    它支持多种操作系统,包括但不限于Windows、macOS、Linux、Android和iOS。通过Qt,开发者可以使用同一套源代码,在不同平台上编译并生成原生外观与体验的应用程序,极大地提高了开发效率和产品一致性。 图形用户...

    基于Qt的P2P聊天软件实现,主要由多个聊天客户端和一个中心注册服务器组成。.zip

    它支持多种操作系统,包括但不限于Windows、macOS、Linux、Android和iOS。通过Qt,开发者可以使用同一套源代码,在不同平台上编译并生成原生外观与体验的应用程序,极大地提高了开发效率和产品一致性。 图形用户...

    source.zip

    视频名称 源码 ----------------------...复杂UI界面设计、GPS与GoogleMap、自定义View、Ubuntu Linux下使用C语言面向底层开发、通过JNI进行底层组件调用、图形与OpenGl ES、界面特效、下载修改及编绎Android框架代码。

    优看阅读(阅后即焚)

    此外,优看科技(YCanPDF)还提供基于以上核心技术(YCanPDF PDF SDK)的定制开发服务,开发人员可通过所提供的示例代码快速上手,更专注于业务开发,而不用了解PDF底层,大大减少开发周期,让您的应用快速投入市场...

    Genome2D-Core:Genome2D高级核心

    基因组2D什么是Genome2D? Genome2D是专注于游戏开发的多平台2D GPU框架。 它使用编程语言构建,可将其... Genome2D-ContextCommon - 所有底层Genome2D上下文的抽象和通用基础Genome2D-ContextFlash - 底层Flash平台依

    go-textile:[已弃用] Textile是用于在IPFS网络上构建可组合应用程序和服务的一组工具和基础结构

    该存储库包含核心API,守护程序和命令行客户端,以及移动(iOS / Android)应用程序的绑定。 提供基于和构建的加密,可恢复,基于模式的跨应用程序数据存储。 我们喜欢将其视为一个分散的数据钱包,它具有用于共享...

Global site tag (gtag.js) - Google Analytics