Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务
有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究。
之前的文章末尾部分说过了service call 可以用来调试系统的binder服务。 传送门: Android native进程间通信实例-binder篇之——简单的单工通信
这次可以用到这个命令了!
1. 随机选取一个java层的服务。
adb shell 中输入命令 service list,选取一个服务来做研究,这次看中的是 textservices, 注意第一个服务 bysysui 后面的 "[ ]" 里面没有内容,不能选取这样的服务来做这次的研究。

2. 搜寻这个服务相关的源码。
frameworks/base/services/core/java/com/android/server/TextServicesManagerService.java
frameworks/base/core/java/com/android/internal/textservice/ITextServicesManager.aidl
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/com/android/internal/textservice/ITextServicesManager.java
3. 选择一个接口用于被 HAL 层的代码访问
可以知道TextServicesManagerService.java 中 有一行 public class TextServicesManagerService extends ITextServicesManager.Stub,
所以我从 ITextServicesManager.aidl 来选择要访问的接口, 这次选的就是 boolean isSpellCheckerEnabled(); 这个函数应该就是返回一个bool变量而已,越简单越好。
4. 搜寻 binder 中 transact 需要输入的 code
因为吧啦吧啦的原因(可以自行去别的博文搜索原理,本系列博文侧重实际操作),所以在out目录下可以获取到每个服务中各个接口访问锁需要传入的code。
在out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/com/android/internal/textservice/ITextServicesManager.java中可以发现熟悉的onTransact接口,
同时发现调用 sSpellCheckerEnabled 的code为TRANSACTION_isSpellCheckerEnabled,
它的定义是:static final int TRANSACTION_isSpellCheckerEnabled = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7);
因为android.os.IBinder.FIRST_CALL_TRANSACTION的值是1, 所以可知code为 8
5. 使用service call 来撩一下 isSpellCheckerEnabled

可以看到Parcel有两个值,第一个是00000000,第二个是00000001.
再看看ITextServicesManager.java中TRANSACTION_isSpellCheckerEnabled这个code的处理,果然write了两次,而第二次writeInt的值就是我们需要获取的bool值了!
ITextServicesManager.java
case TRANSACTION_isSpellCheckerEnabled:
{
data.enforceInterface(DESCRIPTOR);
boolean _result = this.isSpellCheckerEnabled();
reply.writeNoException();
reply.writeInt(((_result)?(1):(0)));
return true;
}
按照之前分析的方法,传送门:Android native进程间通信实例-binder篇之——用parcel传输数组
1. 首先data.enforceInterface 传进去了一个组字符串 private static final java.lang.String DESCRIPTOR = "com.android.internal.textservice.ITextServicesManager";
感觉这组字符串是和校验有关了,查看了Parcel.cpp 源码, 发现enforceInterface果然是对比字符串用的,在这个接口的上面有个接口名字叫做 writeInterfaceToken,
所以到时候要用 writeInterfaceToken 来写这组字符串用于比对校验。
2. writeNoException 和 writeInt 最终调用的是 Parcel.cpp 里面writeInt32,所以reply部分要 readInt32 两次。
6. HAL层代码怎么写
就直接在之前写的mybinderclient.cpp 上面贴源码吧transct 前写校验字符串,然后传入code 值为8,最后readInt32 两次,第二次就是要读取的JAVA 层服务isSpellCheckerEnabled 的值啦!
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>
#include <binder/Parcel.h>
#include <binder/IInterface.h> #include<stdio.h> #define LOG_TAG "binderclient" using namespace android; int main(int argc, char** argv)
{
static int TRANSACTION_isSpellCheckerEnabled = (/*android.os.IBinder.FIRST_CALL_TRANSACTION*/1 + 7); sp<IBinder> ITextServicesBinder = defaultServiceManager()->getService(String16("textservices")); Parcel ITextServicesData, ITextServicesReply; ITextServicesData.writeInterfaceToken(String16("com.android.internal.textservice.ITextServicesManager")); ITextServicesBinder->transact(TRANSACTION_isSpellCheckerEnabled, ITextServicesData, &ITextServicesReply); int ret = ITextServicesReply.readInt32();
int ret2 = ITextServicesReply.readInt32(); printf("ret = %d, isSpellCheckerEnabled = %d\n", ret, ret2); return 0;
}
执行结果:

这次在HAL层通过binder 访问 JAVA 层服务的简单例子就讲解到这里,希望大家看完以后能够触类旁通,在这个例子上面得到启发。
希望读者多多吐槽,我们一起共同进步!!
Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务的更多相关文章
- Android native进程间通信实例-binder篇之——用parcel传输数组
和之前稍微不同,这次要稍微分析一下 Parce.cpp 和 android_os_Parcel.cp p的源码,为的是能够掌握调试技巧,后续传输其它类型数据就能举一反三了! 1. 代码共享 这次 ...
- Android native进程间通信实例-binder篇之——简单的单工通信
网上找了很多binder相关文章,大部分都是在跟踪binder实现源代码,然后再把框架代码贴出来,看着实在费力. 这篇文章从实际出发,直接用一个案例下手,后续想了解binder相关原理的话,可以参考& ...
- Android native进程间通信实例-binder篇之——解决实际问题inputreader内建类清楚缓存
我在实际开发中,遇到一个问题,在电容屏驱动中没有发送input_sync 给上层,导致电容屏有的数据缓存在inputreader 中,会导致系统一系列奇怪问题发生, 至于为什么驱动不发送input_s ...
- Android native进程间通信实例-binder结合共享内存
在android源码的驱动目录下,一般会有共享内存的相关实现源码,目录是:kernel\drivers\staging\android\ashmem.c.但是本篇文章不是讲解android共享内存的功 ...
- Android native进程间通信实例-socket本地通信篇之——基本通信功能
导读: 网上看了很多篇有关socket本地通信的示例,很多都是调通服务端和客户端通信功能后就没有下文了,不太实用,真正开发中遇到的问题以及程序稳定性部分没有涉及,代码健壮性不够,本系列(socket本 ...
- Android native进程间通信实例-socket本地通信篇之——服务端进程异常退出解决办法
导读: 好难受啊,为什么服务端说挂就挂,明明只是客户端关闭而已,服务端怎么能挂呢? 想想,如果手机上使用一个聊天程序的时候,手机端关闭了聊天程序,那么远端服务器程序总不能说挂就挂吧!所以一定要查明真相 ...
- 【Android】进程间通信IPC——Binder
Binder是Android中的跨进程通信方式,bindService的时候,服务端返回Binder对象,通过该对象客户端可以从服务端获取数据.在进程间通信IPC——AIDL中创建了ICustomAi ...
- Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程
转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52420803 前言:在上篇中,分析了MediaPl ...
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
随机推荐
- 学好Java只需要做到这7点,年薪20W起步
大道至简,所以扎实有用的方法,其实都是很简单的,难在踏踏实实的执行过程.今天为大家介绍的就是Java学习的7个看起来非常简单的方法,快学起来吧. 为什么要学习java? Java是目前最流行的编程语言 ...
- dwc_otg驱动 "BUG: sleeping function called from invalid context at mm/page_alloc.c"
方案商的开发板上otg功能只能做device,硬件看过后说没有5v供电,加上后能够识别U盘了,但是内核报了错 [ 3.264000] usb 2-1: new high-speed USB devic ...
- android隐藏显示小键盘
记录一下开发中虚拟键盘的使用,fragment和activity中不同的使用 fragment下点击其它位置隐藏小键盘,复制到initView()方法中 view.setOnTouchListener ...
- DDD实战3 领域层的设计
1.新建一个解决方案文件夹 取名Product 2.在Product解决方案文件夹下面创建一个.net core 类库项目 取名Product.Domain,引用项目DDD.Base项目 3.在类库下 ...
- 微博地址url(id)与mid的相互转换
关键字:新浪 微博 url id mid 互相转换地址:http://www.cnblogs.com/txw1958/archive/2012/12/07/weibo-id-to-mid.html 通 ...
- hadoop学习笔记(四)——eclipse+maven+hadoop2.5.2源代码
Eclipse同maven进口hadoop源代码 1) 安装和配置maven环境变量 M2_HOME: D:\profession\hadoop\apache-maven-3.3.3 PATH: % ...
- GoldenGate过程 abend,报错OGG-00868 ORA-02396: Exceeded Maximum Idle Time, Please Connect Again
GoldenGate过程 abend,报错OGG-00868 ORA-02396: Exceeded Maximum Idle Time, Please Connect Again 参考原始: Gol ...
- Linux 系统安装(5分钟)
安装版本:CentOS 6.5 minimal 虚拟机工具:VMware 虚拟机配置:1核2线程 2G内存 50G硬盘 步骤: 一.虚拟机配置 1.打开VMware,创建新的虚拟机,选择典型安装: 2 ...
- POJ1185:火炮(减少国家)
Description 命令将军打算N*M该网络格他们的炮兵部队部署在地图上.一个N*M该地图由N行M列,每个地图格它可以是山(使用"H" 表示),也可能是平原(用"P& ...
- [转载]Delphi常用类型及定义单元
原文地址:Delphi常用类型及定义单元作者:沧海一声笑 Delphi常用类型及定义单元-总结 sndplaysound mmsystem Type Unit Date ...