为什么 Android 要采用 Binder 作为 IPC 机制?

866 阅读4分钟

网站.jpg

Hi 大家好,我是 DHL,大厂程序员,公众号:ByteCode ,在美团、快手、小米工作过。搞过逆向,做过性能优化,研究过系统,擅长鸿蒙、Android、Kotlin、性能优化、职场分享。

微信小程序「猿面试」每日分享一道大厂面试题,涉及 JavaAndroid鸿蒙和ArkTS设计模式算法和数据结构 等内容。


本篇文章主要以面试为主,因此只要记住这些即可。Android 采用 Binder 作为 IPC (进程间通信) 机制的原因主要包括以下几点,

高效性

Binder 机制通过减少数据拷贝次数来提高 IPC 的效率。在 Binder 机制中,发送方只需要将数据从用户空间拷贝到内核空间一次,接收方可以直接访问内核空间中的数据,避免了额外的数据拷贝。

与其他 IPC 机制相比,Binder 更高效。Binder 数据拷贝只需要一次,而管道、消息队列、Socket 都需要 2 次,但共享内存方式一次内存拷贝都不需要;从性能角度看,Binder 性能仅次于共享内存。

对象级别的通信

与基于消息的通信方式不同,Binder 机制提供了一种面向对象的 IPC 方法。Binder 允许在进程间传递对象引用,开发者可以像调用本地对象一样调用远程对象的方法,而无需关心对象实际所在的进程。这种面向对象的 IPC 方式让编程模型更自然,易于理解和使用。

支持异步通信

除了同步调用外,Binder 还支持异步通信,这对于构建响应式应用尤其重要。通过异步通信,应用可以在等待 Binder 事务完成时继续执行其他任务,提高了应用的响应性和性能。

安全性

Binder 通过使用 UID(用户 ID)和 PID(进程 ID)来验证请求的来源,提供了进程间通信的安全性保障。这意味着每个 Binder 事务都可以精确到发起者,系统可以据此实施安全策略,例如权限检查,从而防止未授权的数据访问或通信。

每个 Binder 通信都有明确的权限控制,可以限制哪些进程可以访问 Binder 服务,从而增强了系统的安全性。

稳定性

与其他 IPC 机制相比,Binder 是基于 C/S 架构的,是指客户端 (Client) 和服务端 (Server) 组成的架构,Client 端有什么需求,直接发送给 Server 端去完成,架构清晰明朗,Server 端与 Client 端相对独立。

而共享内存实现方式复杂,没有客户与服务端之别,需要充分考虑到访问临界资源的并发同步问题,否则可能会出现死锁等问题;

从这稳定性角度看,Binder 架构优越于共享内存

简便性

Binder 为开发者提供了一套易于使用的 API 来进行进程间通信,隐藏了复杂的内部实现。它使得不同应用之间或应用与系统服务之间的数据传递和方法调用变得简单直观。

总之,由于其高效、安全、简便、面向对象等特性,Binder 成为了 Android 系统中进行 IPC 通信的首选机制。这些特性使得 Binder 非常适合移动设备这种资源受限的环境。

全文到这里就结束了,感谢你的阅读,如果文章对你有帮助,欢迎在看、点赞、分享给身边的小伙伴,你的点赞是我持续更新的动力。


更多大厂面试题,欢迎前往微信搜索小程序「猿面试」查看。微信小程序(猿面试)包含了 Java、Android、鸿蒙和ArkTS设计模式算法和数据结构 相关内容,

推荐阅读

开源新项目

  • 云同步编译工具(SyncKit),本地写代码,远程编译,欢迎前去查看 SyncKit

  • KtKit 小巧而实用,用 Kotlin 语言编写的工具库,欢迎前去查看 KtKit

  • 最全、最新的 AndroidX Jetpack 相关组件的实战项目以及相关组件原理分析文章,正在逐渐增加 Jetpack 新成员,仓库持续更新,欢迎前去查看 AndroidX-Jetpack-Practice

  • LeetCode / 剑指 offer,包含多种解题思路、时间复杂度、空间复杂度分析,在线阅读