- 浏览: 835092 次
- 性别:
- 来自: 哈尔滨
-
文章分类
最新评论
-
doloveme:
$sudo cp MONACO_Linux.ttf /usr/ ...
terminator 的配置 -
腾讯rep:
lowser
RSA加密算法c++简单实现 -
csuhanyong:
好YD啊,好YD
一图流:机械键盘各轴区别 -
doloveme:
1。其中:extman ,extmail下载http://ww ...
Ubuntu下安装postfix+extmail邮件服务器 -
doloveme:
repo sync出现“fatal: '../platform ...
Android 编译环境配置搭建(Ubuntu 12.04)及环境导致编译错误QA
题外话:由于同事咨询,口头讲解的话1对1,但不方便多方传播及继承性,因此特意写此文章讲解一番。
1、android service简要说明:
Android Service :又称为 Java Service ,是实现在框架层里的 Service ,使用Java语言编写。
Native Service :又称为 System Service ,是实现在 Runtime 层里的 Service 。使用C++语言编写。
对于这两种service来说,两个对等service通讯都是利用binder,只不过一种利用*.aidl,一种利用IInterface
编写序列化代码而已,本质是一样的,本书先介绍native service的编写及两个native service
如何通讯的过程:
2、native service的特点
A、因为底层核心服务是 Android 框架里最接近 Linux/Driver 的部分。为了充分发挥硬件设备
的差异化特性,核心服务是让上层 Java 应用程序来使用 Driver/HW Device 特色的重要管道。
B、在开机过程中,就可以启动核心服务 ( 例如汉字输入法服务等 ) ,让众多应用程序来共享之。
C、由于共享,所以能有效降低程序的大小及统一的接口变化 。
3、如何实现一个native service
要点如下:
a、核心服务通常在独立的进程 (Process) 里执行。
b、必须提供 IBinder 接口,让其它程序可以进行跨进程的绑定 (Binding) 和呼叫。
c、因为共享,所以必须确保多线程安全 (Thread-safe) 。
d、以 C++ 类别定义,诞生其对象,透过 SM 之协助,将该对象参考值传给 IServiceManager::addService() 函数,就加入到 Binder Driver 里了。
e、应用程序可透过 SM 之协助而远距绑定该核心服务,此时 SM 会回传 IBinder 接口给应用程序。
f、应用程序可透过 IBinder::transact() 函数来与核心服务互传数据。
下面以具体实例讲解一下具体的每个步骤如何实现完成
先说明一个测试例子的模块结构:
serviceTestA 是一个普通的过程,提供两个整数的剩法及除法运算
serviceTestB 是一个普通的过程,提供两个整数的加法及减法运算
TestService 是一个测试进程的程序,主要验证两个服务进程的接口函数,其中的代码可以
放在任何一个进程进行访问调用
a、编写服务进程
serviceTestA.h 头文件定义:
#ifndef __SERVICE_TEST_A__ #define __SERVICE_TEST_A__ #include <utils/RefBase.h> #include <binder/IInterface.h> #include <binder/Parcel.h> #include <utils/threads.h> namespace android{ //继承BBinder类,从而提供IBinder 接口 class serviceTestA:public BBinder { public: serviceTestA(); virtual ~serviceTestA(); static int instantiate(); //建立唯一类实例 virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t); private: // protected by mLock 多线程安全 mutable Mutex mLock; }; } #endif /* __SERVICE_TEST_A__ */
serviceTestA.cpp 实现文件:
#include <cutils/log.h> #include <cutils/properties.h> #include <binder/IServiceManager.h> #include <binder/IPCThreadState.h> #include <serviceTestA/serviceTestA.h> namespace android { enum{ CALCULATE_MUL_NUM = 0, CALCULATE_DIV_NUM , }; int serviceTestA::instantiate() { LOGI("serviceTestA instantiate"); int r = defaultServiceManager()->addService(String16("service.TestA"), new serviceTestA()); LOGI("serviceTestA r = %d/n", r); return r; } serviceTestA::serviceTestA() { LOGI("serviceTestA created"); } serviceTestA::~serviceTestA(){ LOGI("serviceTestA destroyed"); } status_t serviceTestA::onTransact(uint32_t code, const Parcel&data, Parcel*reply, uint32_t flags){ LOGI("serviceTestA::onTransact code = %d",code); Mutex::Autolock _l(mLock); switch(code){ case CALCULATE_MUL_NUM:{ int a = data.readInt32(); int b = data.readInt32(); int sum = a * b ; LOGI("sum mul value = %d",sum); reply->writeInt32(sum); return NO_ERROR; }break; case CALCULATE_DIV_NUM:{ int a = data.readInt32(); int b = data.readInt32(); int sum = a / b ; LOGI("sum div value = %d",sum); reply->writeInt32(sum); return NO_ERROR; }break; default: return BBinder::onTransact(code, data, reply, flags); } return 0; } }
Android.mk 文件:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= serviceTestA.cpp LOCAL_SHARED_LIBRARIES:= libutils libutils libbinder LOCAL_C_INCLUDES := $(TOP)/frameworks/base/include LOCAL_MODULE:= libServiceTestA LOCAL_PRELINK_MODULE:= false include $(BUILD_SHARED_LIBRARY)
这里生成libServiceTestA动态库,方例升级服务程序
编写独立的进程程序:
它的用途是:诞生一个 serviceTestA 类别之对象,然后将该对象参考存入 Binder Driver 里。
#include <sys/types.h> #include <unistd.h> #include <cutils/log.h> #include <binder/IServiceManager.h> #include <binder/IPCThreadState.h> #include <serviceTestA/serviceTestA.h> using namespace android; int main(int argc,char *argv[]){ sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm = defaultServiceManager(); LOGI("ServiceManager: %p", sm.get()); serviceTestA::instantiate(); // 这是重点。。。。 ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); return 0; }
Android.mk 文件:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= main.cpp LOCAL_SHARED_LIBRARIES:= libutils libServiceTestA LOCAL_MODULE:= serviceTestA include $(BUILD_EXECUTABLE)
这里最重要的是调用:serviceTestA::instantiate();
其先执行到 new serviceTestA() ,就诞生一个 serviceTestA 类别之对象;
接着,呼叫 defaultServiceManager() 函数取得 SM 的 IServiceManager 接口;
再呼叫 IServiceManager::addService() 将该对象参考存入 Binder Driver 里,并且同时存入
到ServiceManager中注册并管理,如此其它进程才能通过ServiceManager::getService找到相应服务进程
以上代码同理,serviceTestB服务进程也一样的这样建立,不再复述。
b、测试服务进程
testService.cpp编写:
#include <cutils/log.h> #include <cutils/properties.h> #include <binder/IServiceManager.h> #include <binder/IPCThreadState.h> #include <serviceTestA/serviceTestA.h> #include <serviceTestB/serviceTestB.h> using namespace android; enum{ CALCULATE_ADD_NUM = 0, CALCULATE_SUB_NUM , }; enum{ CALCULATE_MUL_NUM = 0, CALCULATE_DIV_NUM , }; int main(int argc,char *argv[]){ sp<IBinder> TestAbinder; sp<IBinder> TestBbinder; Parcel data, reply; int sum=0; LOGI("testService main is call..."); sp<IServiceManager> sm = defaultServiceManager(); while(1){ TestAbinder = sm->getService(String16("service.TestA")); LOGE("TestA::getAddService %p/n",sm.get()); if (TestAbinder == 0) { LOGE("TestAService not published, waiting..."); usleep(1000000); continue; } else{ LOGI("TestA::getAddService success..."); break; } } while(1){ TestBbinder = sm->getService(String16("service.TestB")); LOGE("TestB::getAddService %p/n",sm.get()); if (TestBbinder == 0) { LOGE("TestBService not published, waiting..."); usleep(1000000); continue; } else{ LOGI("TestB::getAddService success..."); break; } } //测试两个service中的函数 data.writeInt32(1000); data.writeInt32(200); LOGI("BpAddService::create remote()->transact()/n"); TestAbinder->transact(CALCULATE_MUL_NUM,data,&reply); sum = reply.readInt32(); LOGI("CALCULATE_ADD_NUM value = %d",sum); data.writeInt32(1000); data.writeInt32(200); LOGI("BpAddService::create remote()->transact()/n"); TestAbinder->transact(CALCULATE_DIV_NUM,data,&reply); sum = reply.readInt32(); LOGI("CALCULATE_SUB_NUM value = %d",sum); data.writeInt32(1000); data.writeInt32(200); LOGI("BpAddService::create remote()->transact()/n"); TestBbinder->transact(CALCULATE_ADD_NUM,data,&reply); sum = reply.readInt32(); LOGI("CALCULATE_MUL_NUM value = %d",sum); data.writeInt32(1000); data.writeInt32(200); LOGI("BpAddService::create remote()->transact()/n"); TestBbinder->transact(CALCULATE_SUB_NUM,data,&reply); sum = reply.readInt32(); LOGI("CALCULATE_DIV_NUM value = %d",sum); return 0; }
这里最重要的就是通过defaultServiceManager得到默认的sm,然后通过getService得到sp<IBinder>对象,即可操作相应服务进程的接口函数,整个过程还是相当清晰的。
最后附上测试的结果打印:
# ./TestService ./TestService # logcat logcat
结果表明完全正确
发表评论
-
JAVA代码混淆
2016-05-05 18:24 1466JAVA代码混淆 <!--[if !supportL ... -
android 监听状态栏被下拉
2015-12-25 17:23 3499Activity的onWindowFocusChange()方 ... -
android使用mount挂载/system/app为读写权限,删除或替换系统应用
2015-11-27 14:13 4041注意:以下代码中#开头的则为需要执行的shell命令,其他的 ... -
Ubuntu 14.04 文件服务器--samba的安装和配置
2015-11-10 10:49 645jingyan.baidu.com/album/00a07f ... -
linux生成指定大小的文件
2015-08-26 16:02 1703# dd if=/dev/zero of=50M.file ... -
intellij 打开工程在每个java文件上 有个红色的无效符
2015-07-24 13:52 1776说明该类不是可编译文件。在project Structure中 ... -
logcat命令详解
2015-07-22 16:34 998Android日志系统提供了记录和查看系统调试信息的功能。日 ... -
gradle打包遇到的错误汇总
2015-07-21 11:32 0错误1:A problem occurred ... -
Android读写XML(下)——创建XML文档
2015-04-29 11:02 624在前面的2篇文章Android读写XML(上)—— pack ... -
Android读写XML(中)——SAX
2015-04-29 10:54 628在Android读写XML(上) ... -
Android读写XML(下)——创建XML文档
2015-04-29 10:52 710在前面的2篇文章Android读写XML(上)—— pack ... -
android:configChanges locale 改语言后,该配置不起作用的原因
2015-03-23 14:38 2546@Override public void on ... -
android.app.Fragment$InstantiationException 解决办法
2015-03-23 13:46 1425android.app.Fragment$Instantia ... -
linux 查看内存
2015-02-10 13:08 7551、free监控内存使用情况 #free 2、watc ... -
android fastboot 刷机 指令
2015-01-19 18:31 1539原生bootloader:bootloader-gro ... -
[Android实例] android中进行https连接的方式的详解 (转发)
2015-01-09 15:50 701x 如果不需要验证服务器端证书, ... -
编译android源码apk是否生成odex方法
2014-10-20 17:19 1658其实Android系统默认的配置是,如果没有指定DISABL ... -
关于android源码中的APP编译时引用隐藏的API出现的问题
2014-10-20 15:36 862今天在编译android源码中的计算器APP时发现,竟然无法 ... -
Android系统进程Zygote启动过程的源代码分析
2014-09-17 10:09 518在Android系统中, ... -
Handler和HandlerThread
2014-09-16 16:58 7011.什么是Handler? SDK中关于Handler的说 ...
相关推荐
在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的主要机制,尤其在涉及服务(Service)和应用程序组件之间的交互时。在Android的Native层进行Binder通信,可以提升性能并降低内存...
本教程将详细阐述如何使用C++实现一个基于Binder的服务(Service)和客户端(Client),并利用共享内存进行高效的数据传输。 一、Binder基础 Binder是Android系统中的一个核心组件,它提供了跨进程调用方法,让不同...
**Android Native Service** Android Native Service是Android系统中一个核心组件,它允许开发者在C或C++这样的本地代码中实现服务。这种服务与Android应用程序框架交互,提供了高效能、低级别的硬件访问以及对底层...
创建Native Service首先需要在Java层定义一个Service类,声明相关的Binder对象,然后在C/C++层实现服务的具体逻辑。使用` binder`对象,Java层可以启动、停止和绑定到Native Service。 **4. Android.mk与...
Binder是Android系统中的核心组件,它是进程间通信(IPC)的主要机制。在Android系统中,服务、应用程序组件以及系统服务之间通过Binder进行交互。本文将深入探讨Binder的底层实现,特别是涉及C和C++的部分,以及...
4. Native Service与Binder:通过Camera服务的实例,学员将学习如何创建和管理Native Service,并理解Binder作为Android系统间通信的关键角色,以及其在系统架构中的重要地位。 5. App开发:课程不仅覆盖Android...
public class NativeService extends Service { static { System.loadLibrary("native_service"); } public native void startNativeService(); //... } ``` 2. C++层: ```cpp extern "C" JNIEXPORT void ...
对于这两种service来说,两个对等service通讯都是利用binder,只不过一种利用*.aidl,一种利用IInterface编写序列化代码而已,本质是一样的,下面先介绍native service的编写及两个native service如何通讯的过程。
在Android系统中,本地服务(Native Service)是运行在C/C++层的服务,它通过Binder机制与Java层的应用组件进行通信。本示例提供了一个完整的Android本地服务实现,包括服务死亡通知、客户端死亡通知以及服务端对...
本用例源码着重展示了Binder在Native层的应用,适用于Android 2.3版本。 ### 1. Binder基础 Binder在Android中扮演了接口代理的角色,允许不同进程之间的对象调用对方的方法,实现了跨进程的远程方法调用(Remote ...
2. Binder对象:在Java层,Binder是一个接口,而在C++层,Binder是一个类,它实现了Android Framework层与Native层之间的桥梁。通过Binder,我们可以创建跨进程的对象引用,实现远程方法调用。 二、Binder工作原理 ...
Java Binder是应用程序可以直接使用的接口,它依赖于Native Binder,后者又依赖于Kernel Binder,即内核中的Binder驱动程序。所有的Client、Service和Service Manager都是通过系统调用(如open、mmap、ioctl)与设备...
Service组件分为Java层和C++(Native层)两种,但它们的本质都是为了向其他进程提供服务。 当Client组件需要使用Service组件提供的服务时,它必须先获取Service组件的代理对象。这一过程涉及到对Service组件的查询...
`binderclient.rar`这个压缩包文件很可能是包含了一些示例代码或者教程,帮助我们理解如何在Native层使用C++来与Java系统的Binder服务进行交互。下面我们将详细探讨Binder机制以及如何在Native层实现Binder客户端。 ...
`BinderService`作为NativeService的友元类,意味着它可以访问NativeService的私有方法,例如`getServiceName()`,这个方法返回服务的唯一标识,ServiceManager就是通过这个标识来识别并管理各个服务的。 使用...
在Android系统中,Binder作为系统级的IPC机制被广泛应用于各种场景,如Activity Manager与应用进程之间的通信、Service的调用等。 #### 二、ServiceManager的作用 为了更好地理解Binder的工作原理及其在Android中...
本资源"Binder实战大荟萃源码.rar"包含"BinderApiFun.rar"和"BinderNative.rar"两个子文件,分别对应了Binder API层面和Native层的实现细节,对深入理解Binder的工作原理及其应用有着重要价值。 首先,我们来讨论...
在Android平台上,原生服务(Native Service)是一种特殊类型的应用组件,它允许开发者使用C或C++编写系统级服务,从而充分利用底层硬件性能和优化。本主题将深入探讨Android原生服务及其工作原理,以及如何实现多...
- **Java Native Interface (JNI)**:用于Java代码与C/C++代码之间的交互。 - **Dalvik虚拟机**:早期版本的Android使用Dalvik虚拟机执行Java字节码,后来被ART (Android Runtime) 取代。 - **Zygote**:是Android中...