- 浏览: 236917 次
- 性别:
- 来自: 湖南
最新评论
-
yuxuejun1123:
为什么没有powerPC,个人觉得这篇文章把mips和powe ...
ARM MIPS PowerPC比较 -
yy232:
我刚学这个,有点疑问,希望你能为我解答 你说 “任何人只 ...
centos的用户、组权限、添加删除用户等操作的详细操作命令 -
wstxdz1023:
就那么几句代码,全是问题
socket 心跳
我将用API IAudioFlinger:::setMode的调用过程来演示Android IPC的运作,AudioFinger 是程序media_server的一个Service. service_manager 为其它进程提供service管理,它必须在其他服务运行之前启动。 首先打开设备"/dev/binder",然后调用 ioctl(BINDER_SET_CONTEXT_MGR,..)使binder内核驱动知道它是一个service manager,最后进入loop等待其他进程的数据。 BINDER_SERVICE_MANAGER是service_manager的注册句柄,其它进程必须使用它与service_manager进行通信。 获取 IServiceManager的唯一方法是调用defaultServiceManager(IServiceManager.cpp)
(1)Service Manager 的启动(service_manager.c)
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;
}
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)
(2)获取 IServiceManager
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;
}
发表评论
-
Linux x86 编译 Android 遭遇 gnu/stubs-64.h
2011-08-19 10:43 1856这两天心血来潮,执行完 repo sync 后,顺手来了一下 ... -
使用Cygwin下载Android代码树
2011-03-16 20:45 1576--官方说明-- To set up y ... -
Cygwin在win下下载android源代码
2011-03-16 20:43 1069首先下载cygwin,cygwin是一个类linux平台。即在 ... -
Android NDK 环境搭建 - 安装配置 Cygwin
2011-03-16 20:40 29541. NDK 下载 最新版 Android NDK 开发工具包 ... -
Android-触感反馈和声音反馈的效果实现
2011-03-15 12:07 29431)只有系统设置中打开触感反馈选项,方法performHa ... -
socket的服务端框架
2011-03-07 14:17 2698最近查了不少java下面nio ... -
android UI 优化系列之 创建RGB565的缓存
2011-03-05 16:42 1890关于如何优化activity的 ... -
SocketChannel 和 DatagramChannel
2011-03-05 16:19 1921SocketChannel 叫套接字通道,面向流,就是通 ... -
Android 调试工具集
2011-03-05 13:25 12491.TraceView1)功能:用于热点分析和性 ... -
Android 中文API (33) —— Checkable
2011-03-03 17:45 1109声明 欢迎转载,但请保留文章原始出处:) ... -
Toast 和 Looper
2011-03-03 09:02 1136Toast 和 Looper,一个属于 android.w ... -
Activity 与 Main Loope
2011-03-03 08:59 1023上文抛出了一个疑问:UI 线程是在哪里绑定 Looper ... -
Class loading in Android : Begin with PathClassLoader
2011-03-03 08:56 1174Google 在 Android 文档里的《What is ... -
Linux x86 编译 Android 遭遇 gnu/stubs-64.h
2011-03-03 08:54 1251这两天心血来潮,执行完 repo sync 后,顺手来了一 ... -
读《Multitasking the Android Way》(一)
2011-03-03 08:50 1166Android Developers Blog 发表了一篇 ... -
从 Remote Service Binding 学习 AIDL 与 IPC
2011-03-03 08:47 1547默认情况下,一个应用不管有多少个 Activity、Ser ... -
Android SDK Add-on Configure, Compile and Release
2011-03-03 08:44 1899SDK Add-on 是一个比较小众的话题,一是通常厂商不 ... -
Activity Task 与 Intent Filter Flag
2011-03-03 08:42 1245接触 Android 以来,一直觉得对 task、affi ... -
android的原理,不需要太多的剩余内存
2011-03-02 16:05 923不用在意剩余内存的大 ... -
Android IPC框架分析 Binder,Service,Service manager
2011-03-02 15:19 1371我首先从宏观的角度 ...
相关推荐
### Android IPC 及其原理详解 #### 一、引言 Android系统中,进程间通信(Inter-Process Communication,简称IPC)是实现不同进程之间数据交换的重要机制。由于每个进程都有独立的地址空间,因此必须借助特定的...
Binder框架的学习目标可以概括为:深入理解Binder框架的工作原理、学习Binder框架相对于Intent、ContentProvider、Messenger等其他基于IPC的机制的优势、掌握Binder的术语和通信机制、理解异步通信和内存共享的特点...
Binder作为Android系统中的核心IPC机制,其工作原理和实现机制是本书的重点。Binder不仅是一种接口,更是一个轻量级的进程间通信机制。它允许服务在不同的进程中运行,并通过代理和远程对象的概念实现跨进程调用。...
Android IPC机制总结,概念,使用场景,开启多进程模式,运行机制,优缺点以及场景等等
在Android系统中,IPC(Inter-Process Communication,进程间通信)是不同应用程序之间共享数据和协同工作的关键机制。本文将深入探讨Android IPC机制,并通过具体的ContentProvider和Socket通信实例进行详细解析。 ...
AndroidIPC, 各种 Android IPC机制示例 AndroidIPC各种 Android IPC机制示例构建和运行你需要来自adb的root 许可$ ndk-build$ adb push libs/armeabi-v7a/ipc/data/local/$ a
标题中的“AndroidIPC_apk”指的是一个...开发者通过Android的IPC机制实现了这些功能,使应用能在Android系统上与其他应用或服务协同工作。而提供的apk文件是实际的应用程序,可以安装在Android设备上进行测试和使用。
在Android系统中,IPC(Inter-Process Communication,进程间通信)是不同应用程序之间进行数据交换的重要机制。Android作为一款多任务、多应用的操作系统,各应用程序运行在各自的进程中,为了实现功能交互,就需要...
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/...
[AndroidIPC机制(1)-进程和线程](note/AndroidIPC机制[AndroidIPC机制(2)-序列化机制](note/AndroidIPC机制[AndroidIPC机制(3)-AIDL](note/AndroidIPC机制[AndroidIPC机制(4)-Messenger](note/AndroidIPC...
Android IPC调用例子,源至《android开发艺术探索》一书 对应博客总结 http://blog.csdn.net/tianmi1988/article/details/50135371 http://blog.csdn.net/tianmi1988/article/details/50152883
#### 一、IPC(Inter-Process Communication)概念与原理 **IPC**,即进程间通信(Inter-Process Communication),指的是不同进程间的通信方式。在Android系统中,由于安全性和资源隔离的需求,不同的应用程序或者...
《DM365 IPC硬件原理图详解》 DM365 IPC硬件原理图是一套针对基于DM365芯片的高清网络摄像头(IPC)的详细设计方案。该方案涵盖了从主板到电源板再到连接板的全面设计,为开发者提供了一整套的硬件资料,包括原始的...
在Android系统中,IPC(Inter-Process Communication,进程间通信)是不同应用程序之间共享数据和协同工作的关键机制。本文将深入探讨如何利用Socket实现Android进程间的通信。Socket,也被称为套接字,是网络编程的...
Android IPC机制是Android开发中非常重要的一个方面,通过理解IBinder接口和`transact`方法的工作原理,开发者可以更好地掌握如何设计和实现跨进程通信。此外,了解`IPCThreadState`类的具体实现有助于更深入地理解...
有关Android IPC进程间通讯的源码分析
本文将深入探讨Android底层驱动的工作原理、重要性以及如何进行开发。 一、底层驱动概述 1. 定义:底层驱动,也称为设备驱动程序,是运行在操作系统内核层的一段代码,它的主要职责是解析并执行来自上层应用程序或...