我有命令行工具,它发送广播并等待结果。
服务器代码(错误处理省略):
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:权限被拒绝
在 android.net.LocalSocketImpl.connectLocal(本机方法)
在 android.net.LocalSocketImpl.connect(LocalSocketImpl.java:290)
在 android.net.LocalSocket.connect(LocalSocket.java:130)
日志中有错误:
07-27 09:56:08.179:W:类型= 1400审核(0.0:3675):avc:拒绝{连接}路径= 00636F6D2E6B6173706572736B792E6B617368656C6C2E534F434B45542D3631383836 3731373231343337393833373637 scontext=u:r:untrusted_app:s0 tcontext=u:r:shell:s0 tclass =unix_stream_socket 许可=0
我找到了相关的 android 修复:https://android.googlesource.com/device/moto/shamu/+/b2db40f
那么,从android 5.1开始,它就不再工作了吗?
我能做什么(也许以某种方式设置权限)?
或者是否有另一种机制可以从本机命令行工具发送数据并等待结果?