Android开发Android开发经验谈Android技术知识

Framework笔记 | Android Framework用

2019-08-26  本文已影响0人  凌川江雪

主要关注三个层面

  • 列举用到哪些IPC方式
  • 各个IPC方式的特点
  • Framework中是怎么用到的

Android中主要用到的Linux IPC方式



管道通信

看一个例子

if(pid == 0){
    
    close(fd[1]);//把子进程写描述符关闭
    //子进程就可以从读描述符里边把这个字符串给读出来
    read(fd[0], buf, SIZE);


}else if(pid > 0){

    close(fd[0]);//把子进程写描述符关闭
    write(fd[1], "Hello", 5);//父进程往写描述符里边写一个字符串

}

概念图如下,
我们可以看到数据流的方向是
父进程写描述符fd[1]--管道--子进程读描述符fd[0]
即,我们刚刚所说的半双工设计

Framework中哪儿用到了管道

相关阅读

epoll机制有一套函数,共三个,如下

创建epoll句柄:
1. int epfd =epoll_create(intsize);
创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。

2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
将被监听的描述符(对应例程中mWakeReadPipeFd
添加epoll句柄(对应例程中mEpollFd
或从epool句柄中删除或者对监听事件进行修改
(添加、删除和修改通过op位参数进行控制)


3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
注意最后一句话,
该函数返回需要处理的事件数目,即几个事件被触发了,
第二个参数events列表用来接收存入触发的事件;
接着看epoll是怎么监听读端事件的

小结

管道使用起来还是比较方便的,
它可以跟epoll相结合监听读写事件;

管道在进程自身中可以用,
跨进程也可以用;

在数据量不怎么大的跨进程通信的时候还是比较有用的;



Socket通信

Framework中哪里用到

我们看runSelectLoop()



共享内存

Android中哪里用到

MemoryFile是android在最开始就引入的一套框架,其内部实际上是封装了android特有的内存共享机制Ashmem匿名共享内存,简单来说,Ashmem在Android内核中是被注册成一个特殊的字符设备,Ashmem驱动通过在内核的一个自定义slab缓冲区中初始化一段内存区域,然后通过mmap把申请的内存映射到用户的进程空间中(通过tmpfs),这样子就可以在用户进程中使用这里申请的内存了。

参考文章



信号

Android中哪里用到

例1
《开发艺术探索》中有一段类似的描述

zygote翻译成中文是受精卵的意思,名字比较奇怪、但是很有意思,
zygote在android中主要有两个作用
建立运行时环境并启动虚拟机,为应用程序创建DVM进程。
执行com.android.internal.os.ZygoteInit的main函数,
从而fork SystemService。
类似参考文章

例2
上一篇 下一篇

猜你喜欢

热点阅读