`
liujianguangaaa
  • 浏览: 235186 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Android IPC 工作原理(译)

阅读更多

我将用API IAudioFlinger:::setMode的调用过程来演示Android IPC的运作,AudioFinger 是程序media_server的一个Service.


(1)Service Manager 的启动(service_manager.c)

service_manager 为其它进程提供service管理,它必须在其他服务运行之前启动。
int main(int argc, char **argv)
{
struct binder_state *bs;
void *svcmgr = BINDER_SERVICE_MANAGER;
bs = binder_open(128*1024);
if (binder_become_context_manager(bs)) {
LOGE("cannot become context manager (%s)\n", strerror(errno));
return -1;
}
svcmgr_handle = svcmgr;
binder_loop(bs, svcmgr_handler);
return 0;
}

首先打开设备"/dev/binder",然后调用 ioctl(BINDER_SET_CONTEXT_MGR,..)使binder内核驱动知道它是一个service manager,最后进入loop等待其他进程的数据。

void binder_loop(struct binder_state *bs, binder_handler func)
{
int res;
struct binder_write_read bwr;
unsigned readbuf[32];
bwr.write_size = 0;
bwr.write_consumed = 0;
bwr.write_buffer = 0;
readbuf[0] = BC_ENTER_LOOPER;
binder_write(bs, readbuf, sizeof(unsigned));
for (;;) {
bwr.read_size = sizeof(readbuf);
bwr.read_consumed = 0;
bwr.read_buffer = (unsigned) readbuf;
res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
if (res < 0) {
LOGE("binder_loop: ioctl failed (%s)\n", strerror(errno));
break;
}
res = binder_parse(bs, 0, readbuf, bwr.read_consumed, func);
if (res == 0) {
LOGE("binder_loop: unexpected reply?!\n");
break;
}
if (res < 0) {
LOGE("binder_loop: io error %d %s\n", res, strerror(errno));
break;
}
}
}
注意宏定义 BINDER_SERVICE_MANAGER.
/* the one magic object */
#define BINDER_SERVICE_MANAGER ((void*) 0)

BINDER_SERVICE_MANAGER是service_manager的注册句柄,其它进程必须使用它与service_manager进行通信。


(2)获取 IServiceManager

获取 IServiceManager的唯一方法是调用defaultServiceManager(IServiceManager.cpp)

sp<IServiceManager> defaultServiceManager()
{
if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
{
AutoMutex _l(gDefaultServiceManagerLock);
if (gDefaultServiceManager == NULL) {
gDefaultServiceManager = interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
}
}
return gDefaultServiceManager;
}


gDefaultServiceManager定义在libutil,所以任何包含libutil的程序或库都有它的定义,它在每个进程是唯一的,第一次调用的时候变量gDefaultServiceManager为空,所以它会首先通过ProcessState::self()得到一个ProcessState对象,一个进程也只有一个ProcessState对象,ProcessState会打开"/dev/binder"驱动供IPCThreadState使用。 
ProcessState::ProcessState()
: mDriverFD(open_driver())
Now we have an instance of ProcessState, let’s look at the getContextObject.
sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& caller)
{
if (supportsProcesses()) {
return getStrongProxyForHandle(0);
} else {
return getContextObject(String16("default"), caller);
}
}
如果支持ibinder驱动, 就会调用 getStrongProxyForHandle. (Handle为0是为 service manager保留的值, 稍后解释.)
sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle)
{
sp<IBinder> result;
AutoMutex _l(mLock);
handle_entry* e = lookupHandleLocked(handle);
if (e != NULL) {
// We need to create a new BpBinder if there isn't currently one, OR we
// are unable to acquire a weak reference on this current one. See comment
// in getWeakProxyForHandle() for more info about this.
IBinder* b = e->binder;
if (b == NULL || !e->refs->attemptIncWeak(this)) {
b = new BpBinder(handle);
e->binder = b;
if (b) e->refs = b->getWeakRefs();
result = b;
} else {
// This little bit of nastyness is to allow us to add a primary
// reference to the remote proxy when this team doesn't have one
// but another team is sending the handle to us.
result.force_set(b);
e->refs->decWeak(this);
}
}
return result;
}

分享到:
评论

相关推荐

    android IPC及原理简介

    ### Android IPC 及其原理详解 #### 一、引言 Android系统中,进程间通信(Inter-Process Communication,简称IPC)是实现不同进程之间数据交换的重要机制。由于每个进程都有独立的地址空间,因此必须借助特定的...

    Deep Dive into Android IPC-Binder Framework

    Binder框架的学习目标可以概括为:深入理解Binder框架的工作原理、学习Binder框架相对于Intent、ContentProvider、Messenger等其他基于IPC的机制的优势、掌握Binder的术语和通信机制、理解异步通信和内存共享的特点...

    AndroidIPC和binder框架

    Binder作为Android系统中的核心IPC机制,其工作原理和实现机制是本书的重点。Binder不仅是一种接口,更是一个轻量级的进程间通信机制。它允许服务在不同的进程中运行,并通过代理和远程对象的概念实现跨进程调用。...

    Android IPC机制总结(png图)

    Android IPC机制总结,概念,使用场景,开启多进程模式,运行机制,优缺点以及场景等等

    Android IPC机制demo

    在Android系统中,IPC(Inter-Process Communication,进程间通信)是不同应用程序之间共享数据和协同工作的关键机制。本文将深入探讨Android IPC机制,并通过具体的ContentProvider和Socket通信实例进行详细解析。 ...

    AndroidIPC, 各种 Android IPC机制示例.zip

    AndroidIPC, 各种 Android IPC机制示例 AndroidIPC各种 Android IPC机制示例构建和运行你需要来自adb的root 许可$ ndk-build$ adb push libs/armeabi-v7a/ipc/data/local/$ a

    AndroidIPC_apk

    标题中的“AndroidIPC_apk”指的是一个...开发者通过Android的IPC机制实现了这些功能,使应用能在Android系统上与其他应用或服务协同工作。而提供的apk文件是实际的应用程序,可以安装在Android设备上进行测试和使用。

    Android IPC 通信实例

    在Android系统中,IPC(Inter-Process Communication,进程间通信)是不同应用程序之间进行数据交换的重要机制。Android作为一款多任务、多应用的操作系统,各应用程序运行在各自的进程中,为了实现功能交互,就需要...

    Deep Dive into Android IPC & Binder.pdf

    Deep Dive into Android IPC & Binder.pdf Deep Dive into Android IPC/Binder Framework at Android Builders Summit 2013 Binder Overview IPC Advantages of Binder Binder vs Intent/ContentProvider/...

    IPCSamples-master_AndroidIPC_安卓开发_messenger_

    [AndroidIPC机制(1)-进程和线程](note/AndroidIPC机制[AndroidIPC机制(2)-序列化机制](note/AndroidIPC机制[AndroidIPC机制(3)-AIDL](note/AndroidIPC机制[AndroidIPC机制(4)-Messenger](note/AndroidIPC...

    Android IPC

    Android IPC调用例子,源至《android开发艺术探索》一书 对应博客总结 http://blog.csdn.net/tianmi1988/article/details/50135371 http://blog.csdn.net/tianmi1988/article/details/50152883

    Android的IPC与AIDL

    #### 一、IPC(Inter-Process Communication)概念与原理 **IPC**,即进程间通信(Inter-Process Communication),指的是不同进程间的通信方式。在Android系统中,由于安全性和资源隔离的需求,不同的应用程序或者...

    DM365 IPC硬件原理图

    《DM365 IPC硬件原理图详解》 DM365 IPC硬件原理图是一套针对基于DM365芯片的高清网络摄像头(IPC)的详细设计方案。该方案涵盖了从主板到电源板再到连接板的全面设计,为开发者提供了一整套的硬件资料,包括原始的...

    Android 基于Socket 的IPC通信

    在Android系统中,IPC(Inter-Process Communication,进程间通信)是不同应用程序之间共享数据和协同工作的关键机制。本文将深入探讨如何利用Socket实现Android进程间的通信。Socket,也被称为套接字,是网络编程的...

    Android IPC.docx

    Android IPC机制是Android开发中非常重要的一个方面,通过理解IBinder接口和`transact`方法的工作原理,开发者可以更好地掌握如何设计和实现跨进程通信。此外,了解`IPCThreadState`类的具体实现有助于更深入地理解...

    Android IPC源码分析

    有关Android IPC进程间通讯的源码分析

    Android底层驱动原理

    本文将深入探讨Android底层驱动的工作原理、重要性以及如何进行开发。 一、底层驱动概述 1. 定义:底层驱动,也称为设备驱动程序,是运行在操作系统内核层的一段代码,它的主要职责是解析并执行来自上层应用程序或...

Global site tag (gtag.js) - Google Analytics