Android 在native层(c/c++)提供了一种 IPC 机制 —— Binder,Binder的底层是通过共享内存来实现的,共享内存的 wrapper IMemory 也在 Binder 的工程里,而且是可以复用的,即如果想在 Android的 native 层使用共享内存,那么可以使用 IMemory 体系。
源码路径:\frameworks\native\libs\binder
头文件:\frameworks\native\libs\binder\include\binder\*
Binder同时提供了 ndk 和 aidl ,因此同时存在 java 和 c++ 的api 。
native头文件路径:#include
, \frameworks\native\libs\binder\include\binder
核心工程 libbinder
- cc_library_shared {
- name: "libbinder",
-
- ...
-
- srcs: [
- "ActivityManager.cpp",
- "AppOpsManager.cpp",
- "Binder.cpp",
- "BpBinder.cpp",
- "BufferedTextOutput.cpp",
- "Debug.cpp",
- "IActivityManager.cpp",
- "IAppOpsCallback.cpp",
- "IAppOpsService.cpp",
- "IBatteryStats.cpp",
- "IInterface.cpp",
- "IMediaResourceMonitor.cpp",
- "IMemory.cpp",
- "IPCThreadState.cpp",
- "IPermissionController.cpp",
- "IProcessInfoService.cpp",
- "IResultReceiver.cpp",
- "IServiceManager.cpp",
- "IShellCallback.cpp",
- "IUidObserver.cpp",
- "MemoryBase.cpp",
- "MemoryDealer.cpp",
- "MemoryHeapBase.cpp",
- "Parcel.cpp",
- "ParcelFileDescriptor.cpp",
- "PermissionCache.cpp",
- "PermissionController.cpp",
- "PersistableBundle.cpp",
- "ProcessInfoService.cpp",
- "ProcessState.cpp",
- "Static.cpp",
- "Status.cpp",
- "TextOutput.cpp",
- "IpPrefix.cpp",
- "Value.cpp",
- ":libbinder_aidl",
- ],
-
- ...
-
- }
ndk 工程 libbinder_ndk
- cc_library {
- name: "libbinder_ndk",
- ...
- srcs: [
- "ibinder.cpp",
- "ibinder_jni.cpp",
- "parcel.cpp",
- "process.cpp",
- "status.cpp",
- "service_manager.cpp",
- ],
-
- shared_libs: [
- "libandroid_runtime_lazy",
- "libbase",
- "libbinder",
- "libutils",
- ],
-
- ...
-
- }
-
- ndk_library {
- name: "libbinder_ndk",
- symbol_file: "libbinder_ndk.map.txt",
- first_version: "29",
- }
Context Manager 及 Service Manager 是android管理所有 Binder 服务的服务,所有服务的 Binder数据结构都在这个工程里。他和 各个Service 之间通过 /dev/binder 和 /dev/hwbinder 这两个驱动文件沟通。
addService最终会把 service 的相关 metadata 保存在 这个工程里,而不是在 binder 驱动里。getService的查询便是在这个工程里查找 service 字符串,匹配上以后返回对应的服务实例的内存地址并转换为IBinder对象。
代码路径:/frameworks/native/cmds/servicemanager/
Binder Driver 是提供 /dev/binder 和 /dev/hwbinder 这两个设备文件的代码,具体的代码并不在AOSP中,而是在linux kernel 中,比如: