操作系统: Android L
服务器:本机级系统服务器,通过抽象套接字提供服务.
客户:jni正常的第3个APK
使用APK连接套接字时获取“权限被拒绝”.
我以为抽象套接字没有权限!
并且,在adb shell(rooted 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;
}
—编辑1 —:添加一些初始化代码,并将’0’更改为0.相同的结果.
最佳答案 好的,这是它在L上通过引入的bug改变的独家新闻……错误修复是管道:
https://android.googlesource.com/device/moto/shamu/+/b2db40f
而不是java管道或本机管道