为 Android添加底层核心服务

本文介绍如何为Android添加底层核心服务,包括为何需要底层服务、与Java层Service的区别、编写步骤及实例。通过C++实现,利用Binder机制进行进程间通信。
[b]为 Android添加底层核心服务[/b]
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 核心服务,欢迎提出您的意见及建议)
内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性与自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔和过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及和柔和、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能和、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性与灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线与关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环与小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识和梯界面,实现对洗衣机形图编程能力的运行状态的监控与操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性与可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件与PLC的专业的本科生、初级通信与联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读和梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境与MCGS组态平台进行程序高校毕业设计或调试与运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图与实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件和MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑与互锁机制,关注I/O分配与硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值