http://www.yurushao.net/?p=789

Android应用程序使用Localsocket与Linux层通信


此条目发表在
 学习 分类目录,贴了 Android, Linux, localsocket 标签。将固定链接加入收藏夹。localsocket,也叫做Unix Domain Socket,在前一篇文章中讲到过:Unix Domain Socket IPC

在Android API中,有几个类对localsocket进行了封装,不仅可以用来应用程序之间进行IPC通信,还可以跨应用程序层和Linux层运行的程序进行通信。

假设一种情境,你的应用程序需要访问一些本身没有权限访问的数据或者设备,通过Java调用现有的命令行命令无法满足需求。可以考虑的方法是:将功能代码使用C/C++实现,然后编译成二进制文件。应用程序使用Runtime.getRuntime().exec()执行命令行命令,su提权后运行二进制文件,然后使用localsocket与之通信——C/S模式。当然,前提是手机要有root权限。

Unix Domain Socket IPC已经贴过Server端代码,移植到Android编译不会出现太大的问题。其实Android已经对Linux socket进行了封装,直接使用更加方便。


实例化一个LocalSocket对象之后,只需要简单的connect就行了。LocalSocket的connect函数接受一个LocalSocketAddress对象作为参数。

2. 命名空间

LocalSocketAddress构造函数的第一个参数String name,是Server创建的socket文件的路径。需要注意的是第二个参数Namespace,有以下三种取值:

ABSTRACT 	A socket in the Linux abstract namespace  
FILESYSTEM 	A socket named with a normal filesystem path. 
RESERVED 	A socket in the Android reserved namespace in /dev/socket. 

具体选择哪一个(RESERVED貌似是系统用的,我们只需要在ABSTRACT和FILESYSTEM中选择一个),要看Server中实现方式,但是Client和Server一定要统一!!!之前写的Server例子直接就是在文件系统上创建的一个socket文件,所以选择FILESYSTEM。

ABSTRACT何时使用可以参考:Linux manual- unix, AF_UNIX, AF_LOCAL – Sockets for local interprocess communication 大致上是Linux在内存中维护一个socket文件描述符集合,但是不会在文件系统中生成一个具体的socket文件。

3. Android中对Localsocket的封装

Android本身就大量使用到了Localsocket进行跨系统层次的通信,对Localsocket的一些常用操作进行了封装。具体细节和使用方法可以参考Android系统源码的以下文件(代码源码文件根目录):
/system/core/include/cutils/sockets.h
/sysetm/core/libcutils/socket_local_server.c
/system/core/libcutils/socket_local_client.c