[Android] Binder 底层实现及原理

Binder核心库:

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 <binder/xxx> , \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 

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

Binder Driver 是提供 /dev/binder 和 /dev/hwbinder 这两个设备文件的代码,具体的代码并不在AOSP中,而是在linux kernel 中,比如:

https://android.googlesource.com/kernel/arm64/+/refs/tags/android-10.0.0_r0.88/drivers/android/binder.c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值