Android的LocalSocket实现及SELinux权限设置.编译(应用层和native通信)
来源:互联网 发布:union all 不同数据库 编辑:程序博客网 时间:2024/06/15 00:14
Android的LocalSocket(应用层和native通信)是android为系统不同层间或同一层内的不同进程间通信封装的一种通信方法,多用来实现上层因没有操作底层的权限而向底层发送消息进行通信.因此大多时候native层常作为服务端,应用层常作为客户端.
native层service与应用层建立client/server模式socket通信主要代码:
应用层主要代码:
String SOCKET_NAME="myserver";LocalSocket s =null;LocalSocketAddress l;s = new LocalSocket();l = new LocalSocketAddress(SOCKET_NAME,LocalSocketAddress.Namespace.RESERVED);s.connect(l);
native层主要代码:(可以在system目录下,与netd/vold等进程并列创建自己的进程文件夹)
s_fdListen = android_get_control_socket(SOCKET_NAME;ret = listen(s_fdListen, n);s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen);
文件夹下包含有main函数的.cpp文件和对应的.h文件以及其它你所需要的头文件和源文件,另外还有Android.mk文件.
我的Android.mk文件内容如下(可仿照此编写):
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SHARED_LIBRARIES := \ libcrypto \ libutils \ libdl \ libhardware_legacy \ liblog \ liblogwrap \ libmdnssd \ libnetutils \ libsysutils \ libwpa_client \ libcutils \ libqsap_sdk\ libstlport \ libstdc++ \ LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llogLOCAL_MODULE:=myserver LOCAL_SRC_FILES := \ IpCmdController.cpp \ ***.cppLOCAL_C_INCLUDES += external/stlport/stlportLOCAL_C_INCLUDES += bionicinclude $(BUILD_EXECUTABLE)
/system/core/rootdir/init.rc中加入:
service myserver /system/bin/myserverclass mainsocket myserver stream 0660 root system编译完native层的代码后把生成的myserver文件(out/target/product/**/system/bin/下)push到手机的system/bin/下.然而此时还未运行,也无法开机自启动,需要将init.rc中更改的内容编入手机内.于是重新make bootimage,刷机重启.好了,手机中有了myserver进程了,然而由于我通信的一方应用层缺少权限,依旧无法正常通信,可能出现如下错误,关键原因在于SELinux在作怪.
错误:creat localsocket filed!java.io.IOException: No such file or directory
creat localsocket filed!java.io.IOException: Permission denied
此时每次重启手机后在adb shell /root下setenforce 0可正常通信,但每次重启手机设置,不能从根本上解决问题.
解决SELinux权限问题:
这里需要几处配置,
1.首先,在device/qcom/sepolicy/common下新建myservice.te文件,内容如下:
type myservice, domain;type myservice_exec, exec_type, file_type;init_daemon_domain(myservice)allow system_app socket_device:sock_file {read write};
2.在device/qcom/sepolicy/common/file_contexts中添加一句:
/system/bin/myservice u:object_r:myservice_exec:s0
3.如果external/sepolicy/app.te中有"neverallow appdomain socket_device:sock_file write;",可能需要注释掉
配置完之后,再次重新编译boot.img即可.
阅读全文
1 0
- Android的LocalSocket实现及SELinux权限设置.编译(应用层和native通信)
- Android Fk: PKMS(3)之installd及LocalSocket实现Java层与Native层通信
- Android localsocket与native的通信
- Android selinux权限设置
- Android selinux权限设置
- 在Android上使用LocalSocket实现上层Java和底层C++的通信
- 在Android上使用LocalSocket实现上层Java和底层C++的通信
- 在Android上使用LocalSocket实现上层Java和底层C++的通信案例
- Android LocalSocket进程通信
- Android应用层对设备的访问权限的实现
- Android应用层对设备的访问权限的实现
- android native层进程通信
- MiniGUI 体系结构之四——图形抽象层和输入抽象层及 Native Engine 的实现(一)
- MiniGUI 体系结构之四——图形抽象层和输入抽象层及 Native Engine 的实现(二)
- 图形抽象层和输入抽象层及 Native Engine 的实现
- Android中java层使用LocalSocket和底层进行通讯
- android 6.0 Java层和native守护进程socket通信
- Android java层与C层通过localsocket通信、通信协议制定与解析。
- Cocoapods安装中出现的问题解决
- Oracle总结
- 客户端和服务器编码问题
- hdu 6069 统计区间约数的个数 2017 Multi-University Training Contest
- javaweb Filter的使用方法以及配置xml文件
- Android的LocalSocket实现及SELinux权限设置.编译(应用层和native通信)
- JQ AJAX 调用后台方法--
- php面向对象__toString() 用法详解
- php 打印空心金字塔
- 百度地图之判断标注点是不是在所画的圆形中
- Android应用的启动时间
- 如何免 sudo 使用 docker
- Minimum supported Gradle version is 2.14.1. Current version is 2.8. If using the gradle wrapper, try
- 使用 Vue 开发单页应用全攻略