上一节,我们已经学习了Android对硬件支持的调用整体过程,这一节学习下在Android内核中Android的专用驱动。
Android的专用驱动放在内核中并不是为了驱动硬件,而是为了获得特殊的管理权限,比如去为Android Runtime Framework服务。这里列出三个最重要的专用驱动,Logger,Binder和Ashmem。
Logger:
与传统的日志相比,是记录在内核缓冲区当中的,直接内存操作,加快读写操作,对应的目录在/dev/log中。使用环形缓冲区,新日志覆盖旧日志,同时采用日志分类,不同类的日志写在不同的缓冲区。
日志记录除了记录java代码,还记录了c/c++,在框架层通过3个安卓的工具类或者c的工具接口api写入liblog.so,再写入内核中,需要注意的是log是写入内核缓冲区。最后再通过logcat工具读取日志。
分类:
Main:/dev/log/main --次要
System: /dev/log/system --重要
Radio:/dev/log/radio --无线相关
Event:/dev/log/events --系统日志,二进制保存,二进制日志格式由/system/etc/event-log-tags文件描述,系统app的日志。
Ps:每个环形缓冲区对应大小256k
Java日志写入接口
android.util.Log
android.util.Slog
android.util.EventLog
C/C++日志写入接口
LOGV、LOGD、LOGI、LOGW、LOGE
SLOGV、SLOGD、SLOGI、SLOGW、SLOGE
LOG_EVENT_INT、LOG_EVENT_LONG、LOG_EVENT_STRIevent-log-tagsNG
最后,logcat工具的使用,估计已经非常熟练了,不再累述。
Binder驱动:
Binder是为了进程间通讯存在的,和传统的IPC通讯对比,传统的IPC要进行通讯需要执行两次数据拷贝:
内存共享机制虽然只需要执行一次数据拷贝,但是它需要结合其它IPC来做进程同步,效率同样不理想。
Binder特点:一次拷贝数据 | c/s模型 | 既可以进程间,也可以进程内
Binder通讯的四个组件,分别是client server service manager 以及 binder驱动,前三个运行在用户空间,binder驱动运行在内核空间。
运行过程是这样的,首先service向service manager注册,然后开启一个binder线程池,client像service manager查询所需要的service,并返回来一个binder代理对象,通过该对象发送请求。
这里之后会单独拉取一篇出来,因为本阶段这玩意真的搞不太懂...
Ashmem共享内存驱动:
两个特点:
1.用一个文件描述符来标一块共享内存
2.能动态释放部分共享内存
event-log-tags
可以通过IO控制命令ASHMEM_PIN对部分共享内存进行锁定
可以通过IO控制命令ASHMEM_UNPIN对部分共享内存进行解锁
没有锁定的部分共享内存,在系统内存紧张时会被回收
总结:能说出常用的安卓专用驱动,了解Logger的种类和存储位置,了解binder原理,了解ashmem特点
Android内核当中的专用驱动(Logger Binder Ashmem Wakelock Low-Memery-Killer Alarm等)有着特殊的作用,Logger把日志记录在内核缓冲区,纯内存操作意味着可以频繁读写,并且速度快,对应的文件位于/dev/log当中,其中又分为system main radio events,radio是通讯相关的log,events是系统级别日志,系统的格式位于/etc/event-log-tags里面;日志最大256k,是一个环形缓冲区,liblog.so。Binder进程间通讯机制也是安卓最重要的部分之一,最大的特点是高效,通讯数据只需要拷贝一次即可,其他特性比如c/s架构,除了进程间进程内也可以通讯。Ashmem是在binder传输大数据会用到的内存共享驱动,依赖于binder,和传统的共享内存相比,采用了文件描述符和分片内存管理,可以通过IO控制命令锁定/解锁内存区,以便系统可以回收这部分的内存。