LocalSocket
在Unix域名空间创建一个套接字(非服务端)。
是对Linux中Socket进行了封装,采用JNI方式调用,实现进程间通信。
具体就是Native层Server和Framework层Client之间进行通信,或在各层次中能使用Client/Server模式实现通信。
LocalServerSocket
创建服务器端Unix域套接字,与LocalSocket对应。
LocalSocketImpl
Framework层Socket的实现,通过JNI调用系统socket API。
JNI访问接口:
\frameworks\base\core\jni\android_net_LocalSocketImpl.cpp
socket_create
socket_connect_local
socket_bind_local
socket_listen
增加socket资源
\system\core\rootdir\init.rc中:
service installd /system/bin/installd
class main
socket installd stream 600 system system
在启动install服务时,就会为install分配socket文件系统资源:dev/socket/installd
Install服务的Socket资源和名称installd绑定起来。
这些都是在开机初始化化init进程中启动service时完成:
for (si = svc->sockets; si; si = si->next) {
int socket_type = (
!strcmp(si->type, "stream") ? SOCK_STREAM :
(!strcmp(si->type, "dgram") ? SOCK_DGRAM : SOCK_SEQPACKET));
int s = create_socket(si->name, socket_type,
si->perm, si->uid, si->gid);
if (s >= 0) {
publish_socket(si->name, s);
}
}
native层
native 层中作为server:\frameworks\base\cmds\installd\installd.c
int main(const int argc, const char *argv[])
{
//获取已绑定socket
lsocket = android_get_control_socket(SOCKET_PATH);
//监听socket
listen(lsocket, 5);
for (;;) {
//等待客户端建立连接
s = accept(lsocket, &addr, &alen);
for (;;) {
//接收数据 相当于recv
readx(s, buf, count);
//执行相关的操作
execute(s, buf);
}
//关闭socket
close(s);
}
}
class FrameworkListener : public SocketListener {
public:
static const int CMD_ARGS_MAX = 16;
private:
FrameworkCommandCollection *mCommands;
public:
FrameworkListener(const char *socketName);
virtual ~FrameworkListener() {}
protected:
void registerCmd(FrameworkCommand *cmd);
virtual bool onDataAvailable(SocketClient *c);
private:
void dispatchCommand(SocketClient *c, char *data);
};
bool FrameworkListener::onDataAvailable(SocketClient *c) {
char buffer[255];
int len;
if ((len = read(c->getSocket(), buffer, sizeof(buffer) -1)) < 0) {
SLOGE("read() failed (%s)", strerror(errno));
return errno;
} else if (!len)
return false;
int offset = 0;
int i;
for (i = 0; i < len; i++) {
if (buffer[i] == '\0') {
dispatchCommand(c, buffer + offset);
offset = i + 1;
}
}
return true;
}
framework层
\frameworks\base\services\java\com\android\server\pm\Installer.java
boolean connect()
{
//创建socket
mSocket = new LocalSocket();
//设置连接地址
LocalSocketAddress address = new LocalSocketAddress("installd",
LocalSocketAddress.Namespace.RESERVED);
//建立连接
mSocket.connect(address);
//获取数据输入流 可以读数据
mIn = mSocket.getInputStream();
//获取数据输出流 可以写数据
mOut = mSocket.getOutputStream();
}
网友评论