在分析Vold的代码前,先介绍一下Linux系统中的Netlink和Uevent。

1. Netlink的介绍

Netlink是Linux系统中一种用户空间进程和Kernel进行通信的机制,通过这个机制,位于用户空间的进程,可接收来自Kernel的一些信息(例如Vold中用到的USB或SD的插拔消息),同时应用层也可通过Netlink向Kernel发送一些控制命令。

目前,Linux系统并没有为Netlink单独设计一套系统调用,而是复用了Socket的操作接口,只在创建Socket时会有一些特殊的地方。Netlink的具体使用方法,在进行代码分析时再来了解,读者目前只需知道,通过Netlink机制应用层,可接收来自Kernel的消息即可。

2. Uevent介绍

Uevent和Linux的Udev设备文件系统和设备模型有关系,它实际上就是一串字符串,字符串的内容可告知发生了什么事情。下面通过一个实例来直观感受Uevent:

在SD卡插入手机后(我们这里以SD卡为例),系统会检测到这个设备的插入,然后内核会通过Netlink发送一个消息给Vold,Vold将根据接收到的消息进行处理,例如挂载这个SD卡。内核发送的这个消息,就是Uevent,其中U代表User space(应用层空间)。下面看SD卡插入时Vold截获到的Uevent消息。在我的G7手机上,Uevent的内容如下,注意,其中//号或/**/号中的内容是为方便读者理解而加的注释:

**SD卡插入的Uevent消息**

~~~

//mmc表示MultiMedia Card,这里统称为SD卡

add@/devices/platform/msm_sdcc.2/mmc_host/mmc1/mmc1:c9f2/block/mmcblk0

ACTION=add //add表示设备插入,另外还有remove和change等动作

//DEVPATH表示该设备位于/sys目录中的设备路径

DEVPATH=/devices/platform/msm_sdcc.2/mmc_host/mmc1/mmc1:c9f2/block/mmcblk0

/*

SUBSYSTEM表示该设备属于哪一类设备,block为块设备,磁盘也属于这一类设备,另外还有

character(字符)设备等类型。

*/

SUBSYSTEM=block

MAJOR=179//MAJOR和MINOR分别表示该设备的主次设备号,二者联合起来可以标识一个设备

MINOR=0

DEVNAME=mmcblk0

DEVTYPE=disk//设备Type为disk

NPARTS=3 //这个表示该SD卡上的分区,我的SD卡上有三块分区

SEQNUM=1357//序号

~~~

由于我的SD卡上还有分区,所以还会接收到和分区相关的Uevent。简单看一下:

**SD卡插入后和分区相关的Uevent消息**

~~~

add@/devices/platform/msm_sdcc.2/mmc_host/mmc1/mmc1:c9f2/block/mmcblk0/mmcblk0p1

ACTION=add

//比上面那个DEVPATH多了一个mmcblk0p1

DEVPATH=/devices/platform/msm_sdcc.2/mmc_host/mmc1/mmc1:c9f2/block/mmcblk0/mmcblk0p1

SUBSYSTEM=block

MAJOR=179

MINOR=1

DEVNAME=mmcblk0p1

DEVTYPE=partition //设备类型变为partition,表示分区

PARTN=1

SEQNUM=1358

~~~

通过上面实例,我们和Uevent来了一次亲密接触,具体到Vold,也就是内核通过Uevent告知外部存储系统发生了哪些事情,那么Uevent在什么情况下会由Kernel发出呢?

- 当设备发生变化时,这会引起Kernel发送Uevent消息,例如设备的插入和拔出等。如果Vold在设备发生变化之前已经建立了Netlink IPC通信,那么Vold可以接收到这些Uevent消息。这种情况是由设备发生变化而触发的。

- 设备一般在/sys对应的目录下有一个叫uevent的文件,往该文件中写入指定的数据,也会触Kernel发送和该设备相关的Uevent消息,这是由应用层触发的。例如Vold启动时,会往这些uevent文件中写数据,通过这种方式促使内核发送Uevent消息,这样Vold就能得到这些设备的当前信息了。

根据上面介绍可知,Netlink和Uevent的目的,就是让Vold随时获悉外部存储系统的信息,这至关重要。我们总不会希望发生诸如SD卡都被拔了,而Vold却一无所知的情况吧?

android获取uevent实例,9.2.1 Netlink和Uevent介绍相关推荐

  1. android 获取phone实例,Android ContentProvider获取手机联系人实例

    在做项目的时候,因为要用到我们自动获取联系人的姓名和电话,就想到了ContentProvider分享数据的功能,这样做既节省了时间,也减少了我们输入错误号码的几率,所以,想在这里把小demo分享给大家 ...

  2. android 获取phone实例,android – 可以通过sdk来实例化一个telephony.Phone对象吗?

    我正在尝试获取一个电话对象,以便我可以在我的应用程序内调用和会议两个数字. 我已经尝试使用静态PhoneFactory.makeDefaultPhones((上下文))这个,但没有任何运气. Stri ...

  3. android获取电话号码实例

    在Androidmanifest注册获取权限<uses-permission android:name="android.permission.READ_CONTACTS"/ ...

  4. android获取uevent实例,Android的uevent通信机制

    想研究Android从Linux驱动层到Android应用层的一整套流程,于是和刘同事做了个东东实现从驱动层到应用层的一整套通信,做完了,写个笔记备忘一下 总共需要增改的有四个东西,驱动.jni.ja ...

  5. 格式android id,android 获取APP的唯一标识applicationId的实例

    使用getIdentifier()方法可以方便的获各应用包下的指定资源ID. 方式一 int indentify = getResources().getIdentifier("com.te ...

  6. 一种 Android 应用内全局获取 Context 实例的装置

    哥白尼 · 罗斯福 · 马丁路德 · 李开复 · 嫁衣曾经说过 Where there is an Android App, there is an Application context. 没毛病, ...

  7. Android app 标签,android 获取APP的唯一标识applicationId的实例

    使用getIdentifier()方法可以方便的获各应用包下的指定资源ID. 方式一 int indentify = getResources().getIdentifier("com.te ...

  8. android获取服务器时间格式,Android 获取服务器与客户端时差的实例代码

    一般我们在做商品倒计时的时候会遇到要从后台获取商品的开始时间和结束时间,还要计算商品距离开始时间的倒计时和结束时间的倒计时,但是这样只是从后台获取到开始时间,还要再和手机系统的时间相减,才能获取到开始 ...

  9. Android 进程 缓存服务,Android获取应用程序大小和缓存的实例代码

    info package com.qin.appsize; import android.content.Intent; import android.graphics.drawable.Drawab ...

最新文章

  1. [转] Java中public,private,final,static等概念的解读
  2. Vertical Menu ver4
  3. 解读:在什么业务场景适合使用Redis?
  4. Python高级——长连接与短连接(TCP)
  5. 吴恩达深度学习2.3练习_Improving Deep Neural Networks_Tensorflow
  6. mplayer slave 模式文档翻译
  7. 搭建ElasticSearch7.4.2集群
  8. 【转载】html中object标签详解
  9. 服务器保存qq群聊天图片无法显示,电脑中qq群聊天图片无法查看的解决方法
  10. java 代码走查_代码走查如何保证软件质量
  11. 显卡煲机测试软件,铁三角耳机煲机方法三分钟让您学会煲耳机
  12. arping的使用和原理简介
  13. 从总线式以太网到SDN交换机OpenVSwitch
  14. JAVA代码Review
  15. 当百度与重庆相遇,李彦宏的AI越过山丘?
  16. 「教师资格证定期注册」相关答疑
  17. FastAdmin 多表联查 踩坑
  18. 有哪些手机软件支持一键拼图?这几款软件亲测实用
  19. Gradle 2.0 用户指南翻译——第五十一章. 发布工件
  20. 加密与安全(个人笔记)

热门文章

  1. FFmpeg入门详解之19:音视频封装原理简介
  2. 移动端web实现定位(获取GPS)
  3. 【记录1】300G Json文件入库ES
  4. 计算机职称退休,教师已有岗位职称满3年和工龄40年,对退休工资有影响
  5. Pandoc latex 转 word (docx)
  6. HTML5开发Android程序
  7. mysql导出sys数据库_如何使用sys导出数据库
  8. 伪装为kswapd0进程的挖矿木马
  9. 招聘 | 哈工大讯飞联合实验室-春季实习生
  10. 软件架构-从0到1认知分布式架构(上)