Android 消息机制底层原理

Handler与Looper、MessageQueue共同实现了线程间消息传递。MessageQueue的底层实现是利用管道和epoll机制来实现的。

概括:当我们查看Looper.loop()方法时,会发现其中有一个无线循环。那么这其中的原因又是啥呢。当调用Looper.prepare()方法时,底层会创建一个管道,另外还会创建一个epoll实例去监听管道的读文件描述符。

当执行loop方法时,会调用epoll_wait去监听epoll实例中所监听的文件描述符有没有对应的事件,如果没有的话,该方法就会堵塞,所有for循环就没有无限执行下去。当有其他线程向handler发送数据时,就会向管道写数据,那么epoll_wait方法堵塞就会唤醒。

然后我们把管道中的数据都读出来。下一次进行for循坏的时候又会调用epoll_wait方法,如果消息队列没有消息时,就又会堵塞了。

一:什么是管道

管道是一种把两个进程之间的标准输入和标准输出连接起来的机制,从而提供一种让多个进程间通信的方法。通俗一点说就是一个进程向管道写入数据,另外一个进程可以从管道中读取该数据。(ps:不只进程,线程当然也是可以的)

当进程创建管道时,每次都需要提供两个文件描述符来操作管道。其中一个对管道进行写操作,另一个对管道进行读操作。

  1. 使用pipe函数创建一个管道
int pipefd[2];
pipe(pipefd);

当创建管道成功后,pipefd数组将会被赋值,其中pipefd[0]为管道的读端文件描述符,pipedf[1]为管道的写端文件描述符。

  1. 使用pipe函数创建是匿名管道,管道是没有名字的,可以使用那俩个文件描述符对管道进行读写操作。

  2. 写管道操作默认是堵塞的,也就是把数据全部写入缓存后write函数才返回,如果缓存满了就一直堵塞,直到缓存里的数据被读出,数据被全部写入。

二. epoll机制

epoll机制:可以同时监听多个文件描述符的IO读写事件而设计的。

1. 创建一个epoll实例

int epfd = epoll_create(intsize);  

参数 initsize 为epoll实例需要监听的IO读写事件的数目大小。epfd 为epoll实例的文件描述符。

2. 使用epoll来监听某个文件描述符上的事件

int epoll_ctl(int epfd, intop, int fd, struct epoll_event* event); 

第一个参数是 epoll_create() 的返回值,
第二个参数 op 表示动作,用三个宏来表示:
EPOLL_CTL_ADD: 注册新的fd到epfd中;
EPOLL_CTL_MOD: 修改已经注册的fd的监听事件;
EPOLL_CTL_DEL: 从epfd中删除一个fd;
第三个参数是需要监听的fd,
第四个参数是告诉内核需要监听什么事件

举例:利用epoll来监听管道的读文件描述符

int pipefd[2];
pipe(pipefd);  //创建管道

int epfd = epoll_create(intsize); //创建epoll 
struct epoll_event eventItem;
memset(& eventItem,0,sizeof(epoll_event)); // 给eventItem分配内存
eventItem.events = EPOLLIN; //EPOLLIN  表示对应的文件描述符上有可读数据
eventItem.data.fd = pipefd[0];
result = epoll_ctl(epfd,EPOLL_CTL_ADD,pipefd[0],&eventItem);

分析: EventItem是我们定义的事件,事件的类型为EPOLLIN。表示事件为对应的文件描述符上有可读数据,eventItem.data.fd 指定了特定文件描述符。调用epoll_ctl 去监听管道读文件描述符上是否有流到达

3. 使用epoll_wait 来监听注册在epoll实例中的文件描述符的IO读写事件

epoll实例可以注册多个文件描述符,epoll_wait监听epoll实例,这正是多路复用机制,一个epoll监听了多个IO事件。

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
  • 参数events用来从内核得到事件的集合
  • maxevents告之内核这个events有多大(数组成员的个数),这个maxevents的值不能大于创建epoll_create()时的size
  • 参数timeout是超时时间(毫秒,0会立即返回,-1永久等待)
struct epoll_event eventItems[EPOLL_MAX_EVENTS];
int eventCount = epoll_wait(mEpollFd,eventItems,EPOLL_MAX_EVENTS,timeoutMillis)

我们接着利用前面epoll_ctl 注册管道的读文件描述符。这里我们对epoll实例进行监听等待。当管道的读文件描述符没有数据时,这里会被阻塞。当有其他线程或者进程向管道写文件描述符写入数据时,这时epoll_wait会将数据放入eventItems数组中,通过遍历,我们可以拿到对应的事件。

作者:xinwa
链接:https://www.jianshu.com/p/7963755acf59

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android底层开发指的是在Android操作系统中对底层系统组件进行开发和调试的过程。底层开发需要对操作系统的内部机制、底层接口和系统调用有深入的了解。 在Android底层开发中,需要掌握Linux内核、C/C++编程语言以及JNI(Java Native Interface)等技术。开发者需要了解Linux内核的机制和原理,以便能够理解和分析Android系统在底层运行时的行为和逻辑。 在底层开发中,还需要通过C/C++编程语言来编写底层库和驱动程序,与硬件进行交互和通信。这些底层库和驱动程序负责实现Android系统各个组件的底层功能,如图形显示、音频处理、网络通信等。 另外,JNI技术用于在Java层和底层库之间进行交互。通过JNI,可以调用底层库的函数和方法,实现Java层与底层的数据传递和功能调用。 底层开发中经常会涉及到调试和性能优化的工作。开发者需要使用调试工具来分析和追踪底层代码的执行过程,以及解决底层开发中遇到的问题和bug。性能优化方面,可以通过调整底层代码和参数来提高系统的性能和响应能力。 总之,Android底层开发是一项需要对操作系统原理和底层技术有深入了解的工作。通过学习和实践,开发者可以掌握底层开发技术,为Android系统的功能和性能做出贡献。 ### 回答2: Android底层开发是指在Android操作系统中直接与硬件进行交互的开发工作。在Android底层开发中,开发者需要熟悉Linux内核、硬件驱动程序以及底层库等关键技术。 Android操作系统基于Linux内核,因此熟悉Linux内核是进行Android底层开发的基础。开发者需要了解Linux内核的基本原理和结构,以便理解Android系统底层的运行机制。 硬件驱动程序是Android底层开发的重要组成部分,它们负责将硬件设备与Android系统进行连接和通信。开发者需要掌握硬件驱动的编写和调试技巧,以确保硬件设备在Android系统中能够正常工作。 底层库是Android底层开发的另一个关键技术。Android提供了一系列的底层库,用于实现底层功能,比如图形处理、网络通信、多媒体播放等。开发者需要熟悉这些库的使用方法和原理,以便在底层开发中进行功能的实现和调试。 Android底层开发通常涉及到一些高级的编程语言,比如C/C++。开发者需要熟练掌握这些编程语言,以便能够编写出高效和稳定的底层代码。 总之,Android底层开发是一项复杂而庞大的工作,需要开发者具备扎实的技术基础和深厚的理论知识。只有掌握了底层开发所需的关键技术,开发者才能够在Android系统中开发出高效、稳定和功能丰富的应用程序。 ### 回答3: Android底层开发是指在Android操作系统上进行系统级别的功能开发。Android底层开发主要包括四个方面的内容:内核开发、HAL(硬件抽象层)开发、驱动程序开发和底层库开发。 首先,内核开发是指对Android系统内核进行修改和优化,以满足特定需求,并提供更好的性能和稳定性。内核开发需要对操作系统的核心组件进行深入研究和理解,包括进程管理、内存管理、文件系统等。 其次,HAL开发通过编写硬件抽象层的代码,将硬件和操作系统进行连接。这样做的目的是为了让Android系统能够支持不同品牌和型号的硬件设备,如传感器、摄像头、显示屏等。HAL开发需要理解硬件设备的工作原理和规范,并编写对应的接口和驱动程序。 驱动程序开发是为了让Android系统能够正确地识别和使用硬件设备。驱动程序是一种特殊的软件,用于与硬件设备进行通信和控制。驱动程序开发需要具备底层编程语言的知识,如C或C++,以及硬件设备的技术规范和接口协议。 最后,底层库开发是指编写和优化Android系统底层的库文件,以提供一些基础的功能和服务,如网络通信、图形显示、音频处理等。底层库开发需要对操作系统的功能和架构有深入了解,并具备编程技巧和算法优化的能力。 总之,Android底层开发需要深入理解操作系统和硬件设备的工作原理,具备底层编程语言的知识和技能,以及良好的系统分析和优化能力。通过进行Android底层开发,开发者能够深入了解Android系统的运行原理,提升系统性能,并实现定制化和优化的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值