gpt4 book ai didi

android - 无法连接到 android 5.1 上的 native 本地套接字

转载 作者:太空狗 更新时间:2023-10-29 14:08:23 25 4
gpt4 key购买 nike

我有命令行工具,可以发送广播和等待结果。

服务器代码(省略错误处理):

    int makeAddr(const char* name, struct sockaddr_un* pAddr, socklen_t* pSockLen)
{
int nameLen = strlen(name);
pAddr->sun_path[0] = '\0';
strcpy(pAddr->sun_path+1, name);
pAddr->sun_family = AF_LOCAL;
*pSockLen = 1 + nameLen + offsetof(struct sockaddr_un, sun_path);
return 0;
}

int main(int argc, char* argv[])
{
//...

// Create socket in abstract namespace
struct sockaddr_un sockAddr = {0};
socklen_t sockLen;
makeAddr("SOCKET_NAME", &sockAddr, &sockLen);

int serverFd = socket(AF_LOCAL, SOCK_STREAM, PF_UNIX));

bind(serverFd, (const struct sockaddr*) &sockAddr, sockLen);

listen(serverFd, 5);

//set socket non-blocking
int flags = fcntl(serverFd, F_GETFL, 0);
fcntl(serverFd, F_SETFL, flags | O_NONBLOCK);

pollfd pollFd = {0};
pollFd.fd = serverFd;
pollFd.events = POLLIN | POLLRDHUP;

// Send brodcast
system("am broadcast ...");

for(;;)
{
// Wait result
int pollResult = poll(&pollFd, 1, timeout);
// Process result

Java 客户端代码:

public class CommandReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {

LocalSocket socket = new LocalSocket();
LocalSocketAddress address = new LocalSocketAddress("SOCKET_NAME", LocalSocketAddress.Namespace.ABSTRACT);
socket.connect(address);

// Do something and send result asynchronously

这一切都适用于 Android 5.1 之前的版本。

在 android 5.1 connect() 上抛出异常:

java.io.IOException: Permission denied

at android.net.LocalSocketImpl.connectLocal(Native Method)

at android.net.LocalSocketImpl.connect(LocalSocketImpl.java:290)

at android.net.LocalSocket.connect(LocalSocket.java:130)

日志中有错误:

07-27 09:56:08.179: W: type=1400 audit(0.0:3675): avc: denied { connectto } for path=00636F6D2E6B6173706572736B792E6B617368656C6C2E534F434B45542D36313838363731373231343337393833373637 scontext=u:r:untrusted_app:s0 tcontext=u:r:shell:s0 tclass=unix_stream_socket permissive=0

我找到了相对的 android 修复: https://android.googlesource.com/device/moto/shamu/+/b2db40f

那么,从 android 5.1 开始就不能用了吗?我能做什么(也许以某种方式设置权限)?或者是否有另一种机制从 native 命令行工具发送数据并等待结果?

最佳答案

使用管道代替套接字: O_RDWR on named pipes with poll()

在java进程中创建管道:

        mkfifo(cpath, 0);
chmod(cpath, S_IRWXU|S_IROTH|S_IRGRP);

在 native 进程中打开管道:

int serverFd = open(PIPE_NAME, O_RDONLY | O_NONBLOCK);
pollfd pollFd = {0};
pollFd.fd = serverFd.get();
pollFd.events = POLLIN | POLLRDHUP;

// send command
....

for(;;)
{
int pollResult = poll(&pollFd, 1, timeout);

关于android - 无法连接到 android 5.1 上的 native 本地套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31068440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com