1.Android进阶——Android跨进程通讯机制之Binder、驱动驱动IBinder、源码源码Parcel、详解
2.Carson带你学Android:全面剖析Binder跨进程通信原理
3.AndroidFramework ä¹å¯å¨ ServiceManager
4.framework之binder机制
5.你对Framework 底层中的驱动驱动 Binder机制原理了解多少?
6.Framework层的Binder(源码分析篇)
Android进阶——Android跨进程通讯机制之Binder、IBinder、源码源码Parcel、详解eeuc协议源码
前言:
Binder机制是驱动驱动Android系统提供的跨进程通讯机制,这篇文章会从基础概念知识开始介绍,源码源码引出Binder机制,详解并归纳其在Linux系统中的驱动驱动优缺点。接着分析Binder的源码源码通信模型和原理,重点介绍AIDL实现原理,详解以及AMS的驱动驱动Binder体系。文章将穿插介绍IBinder、源码源码Binder、详解Parcel等关键组件,旨在为读者提供易于理解的阅读体验,不涉及Framework层的深度原理,适用于具备AIDL使用基础的读者。
基础概念:
本文将从Linux相关基础概念出发,介绍进程隔离、用户空间与内核空间、系统调用与内核态/用户态,以及内核模块/驱动,帮助读者理解Binder驱动出现的原因。
一、进程隔离
为了保证安全,Linux系统中的进程不能操作其他进程的数据。通过虚拟内存机制,每个进程拥有独立的线性连续内存空间。操作系统将虚拟内存空间映射到物理内存,动漫软件starstar源码实现进程间的隔离。然而,进程间的数据通讯是不可避免的,因此需要跨进程通信机制。
二、用户空间与内核空间
用户空间表示进程运行在特定操作模式中,无权接触物理内存或设备。内核空间则是独立于应用程序,可以访问受保护的内存空间和底层硬件设备。用户进程通过系统调用与内核空间进行交互。
三、系统调用与内核态/用户态
系统调用是用户空间访问内核空间的唯一方式。在Linux系统中,通过四层环的概念,安全边界得以实现,其中1号环持有最高权限,3号环持有最低权限。用户进程需通过系统调用实现跨权限访问。
四、内核模块与驱动
内核模块/驱动通过系统调用实现用户空间与内核空间之间的通信。在Android系统中,Binder驱动作为运行在内核空间的模块,负责各个用户进程间的通讯,实现了进程间的高效、安全通信。
五、总结
将前面的概念综合理解,可以更好地消化知识点:进程隔离导致内存隔离、进程间通信需求、系统调用与内核模块/驱动的apark sql源码分析使用。Binder驱动正是内核模块/驱动中的关键组件,用于实现Android系统的跨进程通信。
为什么要用Binder:
Binder机制相较于Linux系统提供的其他跨进程通信方式,如管道、消息队列、信号量、内存共享、套接字等,具有传输性能好、安全性强等优势。
Binder通信模型与原理:
模型包括服务端注册、客户端获取服务、通信过程。服务端通过Binder驱动在ServiceManager中注册,客户端通过Binder驱动获取并进行通信。
Binder对象与驱动:
Binder驱动对具有跨进程传递能力的对象进行特殊处理,自动完成代理对象与本地对象的转换,保存了每个跨越进程的Binder对象的相关信息。
Java层的Binder与AIDL:
Binder类和BinderProxy类继承自IBinder,具备跨进程传输能力。IBinder是远程对象的基本接口,用于高性能的远程调用。AIDL生成的Stub类继承自Binder,实现了远程服务与客户端的交互。
AIDL实现流程:
服务端实现Stub接口,客户端通过bindService回调获取AIDL接口。调用Stub.asInterface获取BinderProxy对象,进而调用add方法。AIDL原理包括Stub类、asInterface方法、电脑通用指标源码add方法的实现,以及数据传输过程。
AMS的Binder体系:
AMS作为Android核心服务,负责组件启动、切换、调度及应用进程管理。Binder体系在其中发挥关键作用,实现高效、安全的进程间通信。
结语:
本文简要介绍了Binder机制的基本原理,旨在提供易于理解的入门知识。未来将深入探讨Framework层的详细原理。鼓励读者通过手写远程Service实现跨进程通信,以加深对AIDL和Binder的理解。
Carson带你学Android:全面剖析Binder跨进程通信原理
从而全方位地介绍 Binder ,希望你们会喜欢。在本文的讲解中,按照 大角度 -> 小角度去分析 Binder ,即:
从而全方位地介绍 Binder ,希望你们会喜欢。
在讲解 Binder 前,我们先了解一些 Linux 的基础知识
具体请看文章: 操作系统:图文详解 内存映射
Binder 跨进程通信机制 模型 基于 Client - Server 模式
此处重点讲解 Binder 驱动作用中的跨进程通信的原理:
原因:
所以,原理图可表示为以下:
所以,在进行跨进程通信时,开发者只需自定义 Client & Server 进程 并 显式使用上述3个步骤,最终借助 Android 的基本架构功能就可完成进程间通信
注册服务后, Binder 驱动持有 Server 进程创建的 Binder 实体
此时, Client 进程与 Server 进程已经建立了连接
Client 进程 根据获取到的 Service 信息( Binder 代理对象),通过 Binder 驱动 建立与 该 Service 所在 Server 进程通信的链路,并开始使用服务
步骤1: Client 进程 将参数(整数a和b)发送到 Server 进程
步骤2: Server 进程根据 Client 进要求 调用 目标方法(即加法函数)
步骤3: Server 进程 将目标方法的室内箱体指标源码结果(即加法后的结果)返回给 Client 进程
对比 Linux ( Android 基于 Linux )上的其他进程通信方式(管道、消息队列、共享内存、
信号量、 Socket ), Binder 机制的优点有:
特别地,对于从模型结构组成的Binder驱动来说:
不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度。
AndroidFramework ä¹å¯å¨ ServiceManager
æ¬ææºç åºäº Android ï¼æ¶åç¸å ³æºç å¦ä¸ãServiceManagaer æ¯ Binder çå®æ¤è¿ç¨ï¼å¨ Binder æºå¶ä¸èµ·çéè¦çä½ç¨ãæ¬æå°ä»æºç çè§åº¦å¯¹å ¶è¿è¡åæï¼æ´ä½æµç¨å¦ä¸ï¼
æ¶åºå¾å¦ä¸ã
å æ¥çç ServiceManager æ¯å¦ä½å¯å¨çï¼
å¨ Zygote ä¸æä¸è¯´è¿ï¼ init è¿ç¨å¯å¨ç第äºé¶æ®µä¼è§£æ init.rc æ件ã
å¨è¿ä¹åä¼è§¦å trigger init ã
ç»å init.rc çç action init åäºä»ä¹ã
å½è§¦å trigger init åï¼ä¼å¯å¨ servicemanager æå¡ï¼å ¶å£°æå¦ä¸ã
对åºçæ§è¡æ件为 /system/bin/servicemanager ï¼å¨ç¼è¯åä½äº frameworks/native/cmds/servicemanager ä¸ï¼æ¥çç Android.bp ã
å ¶å¯¹åºçæºç 为 service_manager.c å binder.c ï¼å ¥å£å½æ° main() ä½äº servicemanager.c ã
å¯å¨å® ServiceManager åä¼æå¼ Binder 驱å¨ã
å¨ main() ä¸é¦å è°ç¨ binder_open() ã
binder_open() 主è¦åäºå¦ä¸äºæ ï¼
ç»ç»æä½ binder_state åé å åã
ç³»ç»è°ç¨ open() æå¼ /dev/binder ï¼å¦ææå¼é©±å¨å¤±è´¥ï¼åæ§è¡ fail_open éæ¾å åã
ç®åç解éä¸ä¸ä»ä¹æ¯ç³»ç»è°ç¨ï¼
ç±äºéè¦éå¶ä¸åçç¨åºä¹é´ç访é®è½åï¼é²æ¢ç¨åºè·åå«çç¨åºçå åæ°æ®ï¼ CPU åååºä¸¤ä¸ªæéç级ï¼ç¨æ·æå å æ ¸æã
ææçç¨æ·ç¨åºé½æ¯è¿è¡å¨ç¨æ·æï¼ä½ææ¶éè¦åä¸äºå æ ¸æçäºæ ï¼èå¯ä¸å¯ä»¥åè¿äºäºæ çå°±æ¯æä½ç³»ç»ï¼æ以ç¨åºéè¦åæä½ç³»ç»å起请æ±ï¼ä»¥ç¨åºçååæ¥æ§è¡è¿äºæä½ãè¿æ¶å°±éè¦ä¸ä¸ªä»ç¨æ·æåæ¢å°å æ ¸æä½ä¸è½æ§å¶å æ ¸æä¸æ§è¡çæºå¶ï¼è¿ç§æºå¶å°±æ¯ ç³»ç»è°ç¨ã
ç³»ç»è°ç¨ ioctl() ä¼ å ¥ BINDER_VERSION å½ä»¤è·å Binder 驱å¨çæ¬ï¼å¯¹æ¯çæ¬æ¯å¦ä¸è´ï¼ä¸ä¸è´åæ§è¡ fail_open éæ¾å åã
ç³»ç»è°ç¨ mmap() æ å° kb çå å空é´ï¼å³æ Binder 驱å¨æ件ç kb æ å°å°å å空é´ä¾ ServiceManager 使ç¨ï¼å åæ å°å¤±è´¥åæ§è¡ fail_map ï¼å ³é fd 并éæ¾å åã
ServiceManager è¿ç¨ mmap çå å大å°å¯ä»¥éè¿ adb shell å½ä»¤æ¥çã
å¯ä»¥çå°å åæ å°å°å为 0xff ~ 0xf ï¼å·®ä¸º 0x å³åè¿å¶ç kb ã
æå¼ Binder 驱å¨åä¼å° ServiceManager 设置为ä¸ä¸æ管çè ã
è°ç¨ binder_become_context_manager() ã
android æ°å¢ BINDER_SET_CONTEXT_MGR_EXT å½ä»¤æ¥è®¾ç½®å®å ¨çä¸ä¸æ管çè ï¼å¦æ设置失败ï¼å使ç¨åæç BINDER_SET_CONTEXT_MGR å½ä»¤æ¥è®¾ç½®ä¸ä¸æ管çè ï¼ä¸¤è åºå«å¨äºæ¯å¦æºå¸¦åæ°ã
æåä¼è¿å ¥å¾ªç¯ï¼ä» Binder 驱å¨è¯»åå解ææ°æ®ã
è°ç¨ binder_loop() è¿å ¥å¾ªç¯ï¼ä¸æå°éè¿ç³»ç»è°ç¨ ioctl() ä» Binder 驱å¨è¯»åæ°æ®ï¼å¹¶éè¿ binder_parse() è¿è¡æ°æ®è§£æã
注æè¿éè°ç¨ binder_loop() ä¼ å ¥ç svcmgr_handler() ï¼åé¢ä¼ä½¿ç¨å°ã
binder_write() ä¼å°è£ struct binder_write_read ï¼å¹¶éè¿ç³»ç»è°ç¨ ioctl() å°å¯¹åºçå½ä»¤ä¼ éç» Binder 驱å¨ã
binder_parse() ç¨æ¥è§£æä» Binder 驱å¨è¯»åå°çæ°æ®ï¼ç¶åæ ¹æ®ä¸åçå½ä»¤æ§è¡å¯¹åºçæä½ã
å 为 cmd å½ä»¤å¯è½æå¤ä¸ªï¼æ以éè¿ while 循ç¯æ¯æ¬¡å¤çä¸ä¸ª cmd å½ä»¤ï¼å¤ cmd çç»æ大è´å¦ä¸å¾æ示ã
è¿ééç¹çä¸ BR_TRANSACTION å½ä»¤ã
BR_TRANSACTION æ¯ Binder 驱å¨å Server 端åé请æ±æ°æ®ã
binder_transaction_data çç»æå¦ä¸ï¼å ¶è¡¨æäº transcation ä¼ è¾çå ·ä½è¯ä¹ï¼è¯ä¹ç è®°å½å¨ code ä¸ï¼ä¸åè¯ä¹ç æºå¸¦çæ°æ®æ¯ä¸åçï¼è¿äºæ°æ®ç± data æå®ã
å¨è§£æå® binder_transaction_data çå ·ä½è¯ä¹åï¼ä¼è°ç¨åé¢ä¼ ç» binder_loop() ç svcmgr_handler() ï¼å ¶å®å°±æ¯ switch case è¯ä¹ç åä¸åçäºæ ã
ServiceManager çåè½å ¶å®å¾ç®åï¼
è³æ¤ ServiceManager å°±åæå®äºã
framework之binder机制
Android 中的 Binder 是一个关键的进程间通信(IPC)机制,用于实现系统服务和应用程序之间的通信。Binder 由 Binder 驱动程序管理,支持跨进程数据交换。通过 AIDL(Android Interface Definition Language)定义接口,开发者可以创建服务提供者和客户端进行 IPC 通信。本文将详细解析 Binder 的组成、机制、优势以及与 AIDL 的关系。 Binder 机制的组成: 1. **binder接口**:定义远程服务接口,没有具体实现,用于服务调用,如 AIDL 文件中的接口。2. **IBinder接口**:实现 binder 接口,服务的具体实现。
3. **servicemanager**:服务的管理器,客户端和服务端通过它获取和注册服务。
4. **binder驱动程序**:关键组件,实现跨进程通信。示例代码展示了如何通过 Binder 驱动程序在不同进程间进行数据交换。
为什么要使用 Binder? Binder 提供了高效、安全的跨进程通信方式,适合 Android 系统。相比其他方式,如共享内存、Socket、管道和信号量,Binder 在效率、安全性、易用性方面表现更优。例如,Binder 只需拷贝一次,效率接近共享内存,且采用传统的 C/S 结构。 Binder 实现机制解析: 1. **Linux 内存概念**:虚拟内存、用户空间、内核空间和 MMap。虚拟内存提供大容量的内存空间,隔离进程间的数据访问,实现内存共享和惰性加载,同时内核通过 MMap 实现文件和设备的内存映射。 2. **binder 原理**:采用 C/S 架构,涉及 Client、Server、ServiceManager 和 Binder 驱动。ServiceManager 是整个机制的核心,负责服务的注册与获取。Client 和 Server 通过 ServiceManager 与 Binder 驱动交互,实现 IPC。 AIDL 与 Binder 关系概述: AIDL 用于定义跨进程接口,而 Binder 则是实现这些接口的底层驱动,负责进程间的数据传输。在 Android 开发中,通过 AIDL 定义接口,借助 Binder 实现服务的提供与调用,简化了 IPC 通信的复杂性。 本文详细介绍了 Binder 的机制、组成、实现方式以及与 AIDL 的关系,为开发者提供了深入理解 Android 进程间通信机制的框架。你对Framework 底层中的 Binder机制原理了解多少?
Binder 是一种高效、方便、安全的进程间通信方式,用于 Android 中的系统服务和应用程序间的交互。其通信模型涉及四方:Binder 驱动层、Client 端、Service 端和 ServiceManager。Client 端和 Service 端通过 ServiceManager 作为上下文管理者来注册和获取服务。
Client 和 Service 通过 binder_open 打开驱动,根据返回的文件描述符进行内存映射,分配缓冲区,并启动 binder 线程。ServiceManager 的主要功能是注册和获取服务,通过 binder_open 打开驱动,注册为大管家,并进入 binder_loop 循环处理请求。
Service 注册时,首先启动 binder 机制,注册线程,然后初始化服务,最后通过 ServiceManager 注册。ServiceManager 获取服务的 Binder 代理对象,通过 defaultServiceManager 和 getStrongProxyForHandle(0) 方法实现。
Client 获取服务同样通过 ServiceManager 的代理对象实现。Binder 驱动层在处理请求时,根据 handle 值封装 BinderProxy 对象,完成注册过程。
IPC 通信流程涉及 Proxy、Binder、Parcel 和 BpBinder。从应用层的 Proxy 的 transact 函数开始,传递到 Java 层的 BinderProxy,再到 Native 层的 BpBinder 的 transact。BpBinder 的 transact 实际上是调用 IPCThreadState 的 transact 函数,通过 handle 值找到 Binder 实体对象。
Service 端的通信涉及 Binder 线程、getAndExecuteCommand 和 executeCommand。在执行命令时,通过 onTransact 函数处理请求,然后发送 BC_REPLY 响应。Binder 对象在 Parcel 中通过 readStrongBinder/writeStrongBinder 存储,存储原理是 flat_binder_object。
OneWay 是异步调用机制,不需要等待返回结果。系统服务常使用 OneWay,如 Activity 启动。Framework 中使用管道、Socket、共享内存和信号进行进程间通信,这些机制各有特点,用于不同场景。
对于 Android Framework 的深入理解,不仅包括底层原理,还应理解如何在实际开发中运用。为了帮助开发者更深入地掌握 Framework 底层原理,《Android Framework核心笔记》及相关学习资料提供了全面的指导。这些资源涵盖了 Handler、Binder、Zygote、AMS、PMS、WMS 等关键组件的实现细节,是提升 Android 开发能力的宝贵资源。
Framework层的Binder(源码分析篇)
本文以android-.0.0_r的AOSP分支为基础,解析framework层的Binder工作原理。
从ServiceManager的getService方法入手,其核心代码是通过getIServiceManager().getService(name)获取服务。首先,ServiceManager的实现与进程中的ProcessState密切相关,ProcessState是单例,负责打开和映射Binder驱动。构造函数中,它会初始化驱动、验证版本并设置线程数,接着进行binder映射。
在ProcessState的getContextObject方法中,调用native函数android_util_Binder.cpp中的getContextObject()。这个函数通过handle 0(ServiceManager的handle)获取BpBinder对象,然后通过javaObjectForIBinder函数将其转换为Java中的类型。
进一步分析,BpBinder与java层的Binder之间存在对应关系,通过BinderProxy NativeData创建单例的BinderProxy。然后,每个服务的BinderProxy实例化和计数处理都在这个过程中完成。ServiceManagerNative.asInterface方法简化了getIServiceManager的调用,通过调用asInterface实例化ServiceManagerProxy。
IServiceManager接口通过AIDL生成,其代理类ServiceManagerProxy实际上是不必要的。aidl文件在编译时生成对应java代码,用于binder通信。通过aidl文件,我们可以看到如queryLocalInterface等方法的实现细节。
在Parcel的协助下,客户端与服务端进行数据传递,通过序列化和反序列化进行交互。在transact函数中,对Parcel大小进行检查,避免数据传输过大导致的问题。最后,客户端与binder驱动的通信过程涉及了Transaction数据的写入、等待响应、数据处理和内存回收等步骤。
总的来说,framework层的Binder工作涉及服务管理、数据转换、通信协议和内存管理等环节,理解这些有助于深入掌握Binder的工作机制。