0%

之前的两篇文章讲解了java层消息机制的过程以及使用,中间省略了比较多的代码就是在native层实现的消息机制中使用的。这篇文章就对这一部分进行讲解。

起点

我们从第一篇文章知道,Looper.loop()方法被调用后,会启动一个无限循环,而在这个循环中,调用了MessageQueuenext()方法以获取下一条消息,而next()方法中会首先调用nativePollOnce()方法,这个方法的作用在之前说过是阻塞,达到超时时间或有新的消息到达时得到eventFd的通知再唤醒消息队列,其实这个方法也是native消息处理的开始。

阅读全文 »

Android 消息机制(一)消息队列的创建与循环的开始 Looper与MessageQueue中讲述了消息机制的底层实现,下面就从平时所常用的Handler来讲述消息机制的使用。

Handler

Handler是我们平时进行异步、多线程开发中常用的一个组件,如果在应用主线程中调用阻塞的或者资源消耗量大的任务,会造成UI的更新卡顿,所以我们会将这样的任务放在新的线程中进行操作。当需要通知UI进行更新时,我们会使用Handler创建消息丢入主线程的消息队列,再等待主线程的Handler的处理方法随着消息的处理而被调用,再进行下面的操作。这是Handler的基本用法,它的实现就与消息机制密切相关。

下面我们就对它的实现进行分析。

阅读全文 »

写在前面

本文基于Android 7.1.1 (API 25)的源码分析编写

与之前的触摸事件分发机制分析的文章一样,Android系统机制的分析中关键的一环就是事件消息的处理。之前也说过,Android本质上是一个事件驱动的模型,通过各式各样不断产生事件消息的来推动UI、数据的更新与对我们交互的反馈,没有事件消息的产生,就不会有直观的界面的变化,也就不会有应用丰富的功能。

所以Android的消息机制与其他过程的关系是极其紧密的,例如启动Activity的过程就涉及到ActivityManagerService与应用主进程的通信,产生的通知消息通过Binder机制送入应用主进程的消息队列,再由主进程的消息循环来读取这一消息来进行处理。之前触摸事件分发中也是利用了应用主进程的消息队列来读取我们的触摸事件再进行后续的分发处理。可以说消息队列在各种通信过程中无处不在。

消息队列的存在为异步处理提供了一个非常好的基础,有了消息队列之后,我们就可以在新的线程中处理计算、IO密集、阻塞的任务而不会影响UI的更新,在处理过程中可以通过向消息队列中放入消息来进行UI的更新操作,而发送消息的行为也避免了工作线程为了等待返回而造成的阻塞。

可以说,想要了解其他基于事件的过程,对主线程消息机制的了解是必不可少的基础,在触摸事件分发机制分析的文章中我对消息机制还不是很了解,所以后来发现分析中有很多描述不妥的地方,所以在对消息机制的系统学习之后我又修改完善了这部分的内容。

阅读全文 »

回顾

上一篇文章中,我们探索了从内核触摸事件传递到InputDispatcher线程,再与应用线程之间建立InputChannel的过程,并且我们已经看到一个最原始的触摸事件被封装成一个msg并通过InputChannel建立的socket通过sendMessage()方法跨线程通信发送给了应用的UI线程。

这篇文章将会看到应用UI线程的消息队列是如何读取传递过来的触摸事件并进行处理、分发的。

阅读全文 »

写在前面

本文基于Android 7.1.1 (API 25)的源码分析编写

安卓是基于触摸操作进行交互的系统,几乎所有的操作都由对屏幕的一次次触摸完成,如何正确处理触摸事件关乎整个应用的操作体验。因此安卓对于触摸事件的分发与处理机制也是我们学习安卓开发的重中之重。同时几乎每一个安卓技术博客中都会对触摸分发机制这一块进行详解,例如比较早期也是最为出名的郭霖(《第一行代码》的作者)。现在网络上对于这一块的分析也已经比较详尽了,基本上一篇博客中遗漏的部分都可以在其他博客中找到答案。

但是无论别人的文章讲得多好,多么详细,我们都需要自己去打开源码仔细分析好好体会,一是这样一个比较复杂的过程不经历自己的思考很难完全理解,二是随着api版本的推进这部分源码也会发生很多变化,虽然大致思路相同,但是接触到新的内容总是一件好事。

这也就是我写这篇博文的原因:记录自己思考与分析的过程。

阅读全文 »

写在前面

开学学校启用了有线网,由于校园网存在只能单一设备登陆的限制与无线登陆限速,所以想通过路由器刷openwrt再使用mentohust进行校园网的锐捷认证来实现多设备与不限速使用。

在选择路由器时考虑了如下因素:

  1. 可刷openwrt:只有特定的处理器支持openwrt,支持的路由器型号在官网有一个列表,直接参照这个列表选就可以了。
  2. 有电源/usb供电:在寝室使用的话因为有段时间断电但不断网,所以需要自带电源或可用移动电源usb供电。
  3. 性价比高:因为只用于转发校园网,所以可以买便宜一些的。

最终选择了TP-Link mr12u这款路由器,在闲鱼上找了一家同城二手的,45元人民币拿下。

阅读全文 »

Context?

Context在安卓开发时是一个非常常见的组件,我们会在许多地方使用它,举一些例子:

  • 启动新的Activity Service
  • 发送广播,接收广播
  • 填充View
  • 获取资源

相信每一个开发者在看见它时都有过这样一些疑问:

  • Context是什么
  • Context的作用
  • Context从哪里来

同时,我们也经历过需要一个Context但不知道如何去正确获取/传递的情况,事实上不正确地保存一个Context的引用可能会导致部分内存不能被正确GC从而造成事实上的内存泄漏。

本文将着重对上面这些内容进行讲解。

阅读全文 »

Attack Lab

实验代码见GitHub

简介

Attack Lab的内容针对的是CS-APP中第三章中关于程序安全性描述中的栈溢出攻击。在这个Lab中,我们需要针对不同的目的编写攻击字符串来填充一个有漏洞的程序的栈来达到执行攻击代码的目的,攻击方式分为代码注入攻击与返回导向编程攻击。本实验也是对旧版本中IA32编写的Buffer Lab的替代。

我们可以从CMUlab主页来获取自学者版本与实验讲义(Writeup),讲义中包含了必要的提示、建议与被禁止的操作,从这个lab开始之后的lab对讲义中内容的依赖还是很强的。

特别提示lab的自学者版本需要在运行程序时加上-q参数来避免程序向不存在的评分服务器提交我们的答案导致报错

阅读全文 »