Android应用程序使用Localsocket与Linux层通信
2013-04-06 11:28
281 查看
http://www.yurushao.net/?p=789
在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,有以下三种取值:
具体选择哪一个(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
← Unix Domain Socket IPC
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
← Unix Domain Socket IPC
相关文章推荐
- Android 系列 3.10使用本地运行时应用程序日志来分析字段错误或情境
- Android中获取应用程序(包)的大小-----PackageManager的使用(二)
- 使用WakeLock使Android应用程序保持后台唤醒
- 如何开始使用Android应用程序模板
- Android ListView的使用优化以及获取手机所有应用程序
- Android 使用内置的Camera应用程序捕获图像
- Android中获取应用程序(包)的大小-----PackageManager的使用(二)
- 使用Android adb命令来启动Android应用程序
- Android中获取应用程序(包)的大小-----PackageManager的使用(二)
- Android使用Home键后应用程序重启的问题
- Android中获取应用程序(包)的信息-----PackageManager的使用(一)
- Android中获取应用程序(包)的信息-----PackageManager的使用
- android 全部使用NDK开发android应用程序
- Android中获取应用程序(包)的信息-----PackageManager的使用
- Android中使用GridView进行应用程序UI布局的教程
- Android中获取应用程序(包)的信息-----PackageManager的使用(一)
- android使用finish()和System.exit()退出应用程序的理解
- Android SQlite数据库的使用(三)-将数据库文件连同应用程序一起发布
- Android使用AIDL开发播放器报错:抱歉,应用程序已停止运行
- 网格视图在Android应用程序中的使用