《深入理解Android内核设计思想》读书笔记 第6章 进程间通信Binder

系列文章

《深入理解Android内核设计思想》读书笔记 第5章 Android进程/线程管理

6.0 前言

1、要进行进程间通信的原因

不同的进程运行在不同的内存空间,所以无法直接通过内存地址来访问别的进程的数据。Binder的存在就可以给我们提供一种间接的方法进行进程间的通信。

2、Binder的组成部分

  • Binder驱动:运行于内核层,可以提供open(),ioctl(),mmap()等常用的文件操作
  • ServiceManager:保存所有Binder Server。
  • Binder Client
  • Binder Service

6.1 智能指针

1、用于解决C/C++中多个指针问题
  1. 指针没有初始化
  2. new对象后没有及时delete
  3. 野指针
2、智能指针的设计

内存对象 object:具有引用计数器,当引用数为0时销毁对象
《深入理解Android内核设计思想》读书笔记 第6章 进程间通信Binder
弱指针:用于避免对象间相互引用在内存回收时产生的死锁,因为此时两对象都被对方所需要而不能释放,所以规定只要强指针为0就可以回收,wp要升级为sp才能访问它所指的目标对象

6.2 进程间的数据传递载体 – Parcel

将数据通过Parcel“打包”,方便进行间传输

  • 主数据类型以及他们的数组可以通过Parcel打包传递
  • Parcelable 是一个接口,实现该接口的对象可以通过Parcel存取
  • Bundle 实现了Parcelable 接口,以键值对的方式存储数据,是一个载体容器
  • Active Object是Parcel的一个强大武器

    通常存入Parcel的是对象的内容,而这个写入的是对象的特殊标志引用,当读取时可以得到原来被写入的实例,而通过普通Parcel读取到的是新的对象。
    以这种方式传输的对象有2个:
    1、 Binder
    2、FileDescriptor

  • Parcel 的内部实现

    Parcel 只是一个中介,最终所有类型的读写操作都通过本地代码来完成(JNI)
    writeString的实现原理:
    1、writeInt32:写入长度
    2、memcpy:写入数据本身
    3、padding:填充

6.3 Binder驱动与协议