Android ‘;拒绝许可’;连接到抽象unix套接字时

Android ‘;拒绝许可’;连接到抽象unix套接字时,android,sockets,permissions,Android,Sockets,Permissions,操作系统:安卓L 服务器:本机级系统服务器,通过抽象套接字提供服务。 客户端:jni在正常的第三次APK中 使用APK连接套接字时获取“权限被拒绝”。 我以为抽象套接字没有权限 同样的代码在adb shell(根shell)中运行时也可以工作 问题是:许可证设置在哪里 守则: char *target_socket_name = "@mobilelogd"; int sock_id = 0; struct sockaddr_un sun; int address_len; sock_id

操作系统:安卓L
服务器:本机级系统服务器,通过抽象套接字提供服务。
客户端:jni在正常的第三次APK中
使用APK连接套接字时获取“权限被拒绝”。
我以为抽象套接字没有权限

同样的代码在adb shell(根shell)中运行时也可以工作

问题是:许可证设置在哪里

守则:

char *target_socket_name = "@mobilelogd"; 
int sock_id = 0; 
struct sockaddr_un sun;
int address_len;

sock_id = socket(AF_UNIX, SOCK_STREAM, 0);

if (sock_id < 0) {
    LOG("in %s: Unable to create socket: %s\n", __func__, strerror(errno));
    return -1;
} else {
    LOG("socket created!\n");       
}
memset(&sun, 0, sizeof(sun));
sun.sun_family = AF_UNIX;
strncpy(sun.sun_path, target_socket_name, strlen(target_socket_name));
sun.sun_path[0] = 0;
address_len = offsetof(struct sockaddr_un, sun_path) + strlen(target_socket_name);

if (connect(sock_id, (struct sockaddr *)&sun, address_len) == -1) 
{
    LOG("in %s: Connect to socket failed: (%d),%s\n", __func__, errno, strerror(errno));
    close(sock_id);
    return -1;
}
char*target_socket_name=“@mobilelogd”;
int sock_id=0;
结构sockaddr_un sun;
国际地址;
sock\u id=socket(AF\u UNIX,sock\u流,0);
如果(sock_id<0){
日志(“在%s中:无法创建套接字:%s\n”,\uuu func\uuuu,strerror(errno));
返回-1;
}否则{
日志(“已创建套接字!\n”);
}
memset(&sun,0,sizeof(sun));
sun.sun_family=AF_UNIX;
strncpy(sun.sun_路径、target_socket_名称、strlen(target_socket_名称));
sun.sun_路径[0]=0;
地址\u len=偏移量(结构sockaddr\u un,太阳路径)+strlen(目标套接字名称);
if(连接(sock_id,(struct sockaddr*)和sun,地址长度)=-1)
{
日志(“在%s中:连接到套接字失败:(%d),%s\n”,\u func\u,errno,strerror(errno));
关闭(sock_id);
返回-1;
}

---编辑1---:添加一些初始化代码,并将“0”更改为0。相同的结果。

好的,这是它在L上因引入错误而更改的独家新闻。错误修复是管道:


因为Android操作Linux内核并将其添加到其中,所以您应该向清单文件添加以下权限

<uses-permission android:name="android.permission.INTERNET" /> 

Android在Linux内核中添加了一个“偏执网络”选项,根据调用进程的组限制对某些网络功能的访问


因此,您的应用程序的
uid
(用户id;每个应用程序安装后都分配了唯一的
uid
)必须被授予该权限才能执行网络任务。

没有为抽象套接字设置权限。首先,尝试将
memset中的“0”更改为0(&sun,0,sizeof(sun))
Than,你是如何初始化
sock\u id
target\u socket\u name
?可能在你的应用程序清单中添加INTERNET权限会对你有所帮助?你是否尝试了我的建议?INTERNET权限已在清单中,抱歉,它不是答案INTERNET权限已在清单中,抱歉,它不是答案谢谢,看来SeLinux就是答案!使用
setEnforce0
禁用SEAndroid后,它现在可以工作了。虽然我找不到设置permission的excat位置。