跳至主要內容
Binder Parcel

背景

Pacel 是 IPC 通信中的序列化和反序列化类;

从 IPC API 开始

官方给出了 IPC 接口的使用方式,其中规定了 Parcel 相关的操作。

JS 侧的客户端在发送消息的时候需要按照如下的方式使用:

import rpc from "@ohos.rpc"
// 使用期约
let option = new rpc.MessageOption()
let data = rpc.MessageParcel.create()
let reply = rpc.MessageParcel.create()
// 往data里写入参数
proxy.sendRequest(1, data, reply, option)
    .then(function(result) {
        if (result.errCode != 0) {
            console.error("send request failed, errCode: " + result.errCode)
            return
        }
        // 从result.reply里读取结果
    })
    .catch(function(e) {
        console.error("send request got exception: " + e)
    }
    .finally(() => {
        data.reclaim()
        reply.reclaim()
    })

// 使用回调函数
function sendRequestCallback(result) {
    try {
        if (result.errCode != 0) {
            console.error("send request failed, errCode: " + result.errCode)
            return
        }
        // 从result.reply里读取结果
    } finally {
        result.data.reclaim()
        result.reply.reclaim()
    }
}
let option = new rpc.MessageOption()
let data = rpc.MessageParcel.create()
let reply = rpc.MessageParcel.create()
// 往data里写入参数
proxy.sendRequest(1, data, reply, option, sendRequestCallback)

Someone大约 6 分钟AndroidOHOSAndroidBinder
Binder 内存管理

概览

Binder 内存管理指的是:管理 binder mmap 映射的这块缓冲区。其中有两个关键的数据结构:

binder_alloc:缓冲区分配器,对每个使用 binder 进行 IPC 通信的进程,事先建立一个缓冲区;

binder_buffer: 描述缓冲区的数据结构

本文先对这两个关键的数据结构进行研究,然后再逐一分析使用这些数据结构的相关函数和算法。

数据结构分析

binder_alloc


Someone大约 4 分钟AndroidKernelkernelAndroidBinder
Binder Phases

本文主要讲述 Binder 流程中的各个阶段,起到一个 Overview 的目的。


Someone大约 6 分钟AndroidkernelAndroidBinder
IPC Binder 之杂谈

Abstract

进程间通信(IPC) 在系统中非常重要,目前 Android 的 binder 方案已经属于行业内非常优秀的实践案例;但是作为软件从业人员,如果仅仅满足于现有架构或者技术的优势,这是远远不够的。所以本文有几个重要的目的:

  1. 第一是从对比、实践、设计的角度去看看 binder 有什么缺陷和改进点
  2. 第二是研究一下业界最新的技术是如何优化 IPC 的,或者说有没有什么新的思路借鉴?
  3. 第三是一些杂谈

Binder 优缺点

优点

对于 binder 具体的分析可以看我的另一篇博文《Research on Binder》,在此对具体的技术细节就不进行赘述,总的来看,binder 的优点包括以下几个:


Someone大约 6 分钟AndroidkernelAndroidBinder
Research on Binder

Overview

kernel 侧实现:kernel/linux-5.10/drivers/android/binder.c

native 侧实现:system/libhwbinder

💯💯 本文主要是针对 binder 的理解进行的行为,代码列举和文字之间关联度不高,如果想了解原理但是不想对代码进行走读的,可以跳过代码解析的部分,以免陷入太多的细节。

IPC 通信

binder 相比于传统的 IPC 通信拥有比较大的优势:其只需要进行一次拷贝。IPC 通信的原理大致如下:

Binder 线程池


Someone大约 17 分钟AndroidkernelAndroid