6735 L Android连接系统socket服务出现权限错误
user root
group system system
socket southSDK stream 777 system system
oneshot
southdaemon.c部分代码:
#define SOCKET_SOUTHSDK "southsdk"
int main (void)
{
int lsocket, s, err, fd;
struct sockaddr addr;
socklen_t alen = sizeof(addr);
printf("Reading the buffccy2 is by ccy3\n");
lsocket = android_get_control_socket(SOCKET_SOUTHSDK);
if (lsocket < 0) {
SOU_ERR("fail to get socket fROM environment: %s\n",strerror(errno));
printf("Reading the buffccy2 is by ccy2\n");
exit(1);
}
if (listen(lsocket, 10)) {
SOU_ERR("listen on socket failed: %s\n", strerror(errno));
exit(1);
}
printf("Reading the buffccy2 is by ccy1\n");
while(1)
{
s = accept(lsocket, &addr, &alen);
if (s < 0) {
SOU_ERR("Accept failed! :%s\n", strerror(errno));
continue;
}
fcntl(s, F_SETFD, FD_CLOEXEC);//
if (epoll_init(s)) {
SOU_ERR("epoll_init: %d (%s)\n", errno, strerror(errno));
exit(1);
}
SOU_MSG("new connection\n");
for (;;) {
err = process();
if (err == ERR_REMOTE_HANGUP) {
SOU_ERR("remote hangup (cleanup?), wait for new connection\n");
break;
} else if (errno == EINTR) {
continue;
} else if (err) {
SOU_ERR("process data error: %d (%s)\n", errno, strerror(errno));
}
}
SOU_MSG("closing connection\n");
close(s);
epoll_destroy();
}
SOU_MSG("exit southdaemon \n!");
return 0;
}
在adb shell下 ps 可以看到系统服务 southdaemon有运行
root 233 1 10540 752 0084c478 7f17cba4 S /system/bin/southdaemon
现在Android连接服务报权限异常:
Android源码:
package com.example.gpssocket;
import java.io.IOException;
import java.io.OutputStream;
import android.app.Activity;
import android.net.LocalSocket;
import android.net.LocalSocketAddress;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
private final String DEBUG_TAG = "ccy";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.Layout.activity_main);
LocalSocket sock = new LocalSocket();
LocalSocketAddress sockaddr;
sockaddr = new LocalSocketAddress("southsdk", LocalSocketAddress.Namespace.RESERVED);
byte[] send = {'1', '2', '3', '4','0'};
//String str = "121323232";
//send[1] = int2OneByte(flag);
try {
sock.connect(sockaddr);
OutputStream out = sock.getOutputStream();
out.write(send);
Thread.sleep(300);
out.close();
sock.close();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e(DEBUG_TAG, e.toString());
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
有高手可以帮帮忙吗 怎么解决 谢谢! 错误提示权限问题

高手人呢
你这是在以前4.4上移植过来的对吗?
这个应该是selinux导致的权限问题,
你可以试着在adb shell里面执行 setenforce 0
这个命令把selinux关掉,不要重启再测试。
多谢提醒 我先试下
好的, 有问题请继续跟贴,没问题请结贴,谢谢!
现在已经确认是selinux权限的问题了 ,请问下在selinux te权限要加哪几个文件 、怎么加 ?
问题已解决 下面是一个demo, 方便大家参考.
定义一个init 启动的service, demo_service, 对应的执行档是/system/bin/demo.
(1). 创建一个demo.te 在/device/mediatke/common/sepolicy 目录下, 然后在
/device/mediatke/common/BoardConfig.mk 的BOARD_SEPOLICY_UNION 宏中新增 demo.te (注意: M
版本后取消了BOARD_SEPOLICY_UNION 宏,不需要再修改了,添加了文件即可)
(2). 定义demo 类型,init 启动service 时类型转换, demo.te 中
type demo, domain;
type demo_exec, exec_type, file_type;
init_daemon_domain(demo)
(3). 绑定执行档 file_context 类型
/system/bin/demo ubject_r:demo_exec:s0
(4). 根据demo 需要访问的文件以及设备, 定义其它的权限在demo.te 中.
如果大家需要更加深入理解SELinux ,可以参考:
MTK Online SELinux Topic, 没有比这更加完整的文档了.
好的,解决了就好!
