9.13 Binder系统_Java实现_内部机制_Server端
logcat TestServer:* TestClient:* HelloService:* *:S &
CLASSPATH=/mnt/android_fs/TestServer.jar app_process / TestServer &
CLASSPATH=/mnt/android_fs/TestClient.jar app_process / TestClient hello
CLASSPATH=/mnt/android_fs/TestClient.jar app_process / TestClient hello weidongshan
app_process: frameworks\base\cmds\app_process\app_main.cpp
6.1 server如何读取数据
使用app_process来启动server进程,
它会先创建子线程:
AppRuntime::onStarted()
proc->startThreadPool();
spawnPooledThread(true);
sp<Thread> t = new PoolThread(isMain);
t->run(name.string());
// 它会创建子线程, 并执行threadLoop
IPCThreadState::self()->joinThreadPool(mIsMain);
{
do {
result = getAndExecuteCommand();
result = talkWithDriver();
result = executeCommand(cmd);
对于BR_TRANSACTION数据,
sp<BBinder> b((BBinder*)tr.cookie);
error = b->transact(tr.code, buffer, &reply, tr.flags);
} while(...)
}
6.2 server读到数据后怎么调用服务PRC层的onTransact函数
a. 在addService时设置.ptr/.cookie
ServiceManager.addService("hello", new HelloService());
分析:
a.1 new HelloService()是JAVA对象
a.2 处理数据时把.cookie转换成BBinder对象, 它是c++对象
所以: addService中肯定会把JAVA对象转换成一个BBinder派生类对象,存在.cookie里
结论:
a.1 addService会通过JNI调用c++函数:
创建一个BBinder派生类JavaBBinder对象,
它的.mObject指向JAVA对象: new HelloService()
它含有onTransact函数
把这个对象存入.cookie(最终存入binder驱动中该服务对应的binder_node.cookie)
a.2 server进程从驱动中读到数据,里面含有.cookie
把它转换为BBinder对象,
调用它的transact函数
它会调用到派生类JavaBBinder中定义的onTransact函数
a.3 JavaBBinder中定义的onTransact函数(c++)
它通过JNI调用java Binder的execTransact方法,
然后调用Binder派生类IHelloService.Stub中定义的onTransact函数(JAVA)
a.4 IHelloService.Stub中定义的onTransact函数(JAVA):
分析数据
调用sayhello/sayhello_to
源码阅读:
a.1 ServiceManager.addService("hello", new HelloService());
ServiceManagerProxy.addService:
// Parcel.java
data.writeStrongBinder(service);
nativeWriteStrongBinder(mNativePtr, val); // val = service = new HelloService()
它是一个JNI调用,对应android_os_Parcel_writeStrongBinder(c++)
a.2 android_os_Parcel_writeStrongBinder(c++)
它会构造一个JavaBBinder对象(c++),.mObject=new HelloService() JAVA对象
然后让.cookie=JavaBBinder对象(c++)
// 把Java Parcel转换为c++ Parcel
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
// .cookie = ibinderForJavaObject(env, object)得到一个JavaBBinder对象
parcel->writeStrongBinder(ibinderForJavaObject(env, object))
a.3 ibinderForJavaObject(env, object) //object = new HelloService()
把一个Java对象(new HelloService())转换为c++ IBinder对象
JavaBBinderHolder* jbh = (JavaBBinderHolder*)env->GetLongField(obj, gBinderOffsets.mObject);
return jbh != NULL ? jbh->get(env, obj) : NULL;
b = new JavaBBinder(env, obj); // obj = new HelloService()
mObject = new HelloService()//在JavaBBinder的构造函数中执行
a.4 从驱动中得过了.cookie, 它是一个JavaBBinder对象
调用它的transact函数,导致JavaBBinder对象的onTransact被调用
JavaBBinder::onTransact (调用java里的某个函数)
// mObject指向 HelloService对象
// gBinderOffsets.mExecTransact指向: java Binder类中的execTransact方法
// 调用HelloService(派生自Binder)对象中的execTransact方法
jboolean res = env->CallBooleanMethod(mObject, gBinderOffsets.mExecTransact,code, reinterpret_cast<jlong>(&data), reinterpret_cast<jlong>(reply), flags);
a.5 java Binder的execTransact方法:
res = onTransact(code, data, reply, flags);
调用HelloService中的onTransact方法(来自IHelloService.Stube)
分辨数据
调用sayhello/sayhello_to
b.读取到的数据里含有.ptr/.cookie
它会把cookie转换成BBinder对象
调用它的transact函数
joinThreadPool()
{
do{
result = getAndExecuteCommand(); //
result = talkWithDriver();//读取数据
result = executeCommand(cmd);//分析数据
对于BR_TRANSACTION数据
sp<BBinder> b((BBinder*)tr.cookie);//把cookie转换成BBinder对象
error = b->transact(tr.code,buffer,&reply,tr.flags)
}
}
9.13 Binder系统_Java实现_内部机制_Server端的更多相关文章
- 9.12 Binder系统_Java实现_内部机制_Client端
Java实现中client端的RPC层(java实现)如何通过JNI来调用IPC层(C++实现)发送数据 TestServer通过addService向Service_manager注册的时候Test ...
- 9.8 Binder系统_c++实现_内部机制1
1. 内部机制_回顾binder框架关键点 binder进程通讯过程情景举例: test_server通过addservice向service_manager注册服务 test_client通过get ...
- 9.10 Binder系统_Java实现_hello服务
怎么做?2.1 定义接口: 写IHelloService.aidl文件, 上传, 编译, 得到IHelloService.java 里面有Stub : onTransact, 它会分辨收到数据然后调用 ...
- 9.9 Binder系统_Java实现_Android里java程序的编译启动
如果知道了进程号:通过ls /proc/进程号/task 可以看到所有线程 cat /proc/进程号/task/线程号/comm 可以达到线程名字(主线程是main,主线程号就是进程号) d ...
- 9.7 Binder系统_c++实现_编写程序
参考文件:frameworks\av\include\media\IMediaPlayerService.h (IMediaPlayerService,BnMediaPlayerService)fra ...
- 9.2 Binder系统_驱动情景分析_服务注册过程
1. 几个重要结构体的引入给test_server添加一个goodbye服务, 由此引入以下概念: 进程间通信其实质也是需要三要素:源.目的.数据,源是自己,目的用handle表示:通讯的过程是源向实 ...
- Android驱动学习-内部机制_回顾binder框架关键点
内部机制_回顾binder框架关键点server注册服务时, 对每个服务都提供不同的ptr/cookie,在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie cli ...
- 9.11 Binder系统_分层
1.Binder系统过程分析,情景分析 server提供服务 (1)addService(服务名称,xxx)执行后会导致binder驱动在server的内核空间为服务创建一个binder_node结构 ...
- 012_STM32程序移植之_内部flash开机次数管理lib库建立
012_STM32程序移植之_内部flash开机次数管理lib库建立 1. 测试环境:STM32C8T6 2. 测试接口: 3. 串口使用串口一,波特率9600 单片机引脚------------CH ...
随机推荐
- centos 6.7下安装rabbitmq 3.6.6过程
准备,请确保有root权限或者sudo权限,不然不用继续看下去了. 1.erland的安装 首先测试一下是否已经安装了erlang,命令 rpm -qa | grep erlang 若没有安装,则 y ...
- 【DRF权限】
目录 权限的详细用法 我们都听过权限,那么权限到底是做什么的呢. 我们都有博客,或者去一些论坛,一定知道管理员这个角色, 比如我们申请博客的时候,一定要向管理员申请,也就是说管理员会有一些特殊的权利, ...
- golang语言入门及安装
golang语言入门及安装 go语言是google在2009年发布的开源编程语言使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全.支持并行进程. 本次讲解在windows上安装go语言的开 ...
- nexus 搭建maven私服
1. nexus 下载地址 https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.14.4-03-bundle.tar.g ...
- 如何优雅的写UI——(4)选项卡美化
现在做出来的选项卡实在太丑的,咱们怎么把他弄得好看一点呢 tabctrl是可以添加icon图标的,那派生与tabctrl的mfctabctrl肯定也能添加图标,他们两个添加图标的原理一样,但是还是有点 ...
- [置顶]
Docker学习总结(3)——Docker实战之入门以及Dockerfile(三)
应用镜像 csphere/wordpress:4.2 # cd docker-training/wordpress/ # ls -a . license.txt wp-config-sample.ph ...
- hdu 1588 Gauss Fibonacci(矩阵嵌矩阵)
题目大意: 求出斐波那契中的 第 k*i+b 项的和. 思路分析: 定义斐波那契数列的矩阵 f(n)为斐波那契第n项 F(n) = f(n+1) f(n) 那么能够知道矩阵 A = 1 1 1 0 ...
- windows下硬盘安装debian
windows下硬盘安装debian 此方法在 windows8.1 + debian8.7.1 可用 配置系统安装镜像 1 在windows下格式化一个fat32的分区 2 把下载的debian-7 ...
- scrollBarStyle- listview滑动条调整
今天在解决问题的时候,需要设置listview滚动条,使listview的内容不能被滚动条覆盖 后来发现网上提到一个 ScrollView 属性.ScrollView中ScrollBar的style ...
- selenium模块用法详解
selenium用法详解 selenium主要是用来做自动化测试,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题. 模拟浏览器进行网页加载,当requests,urllib无法正常获取 ...