码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • [Android Frameworks] native Binder and IMemory


    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 , \frameworks\native\libs\binder\include\binder

    核心工程 libbinder 

    1. cc_library_shared {
    2. name: "libbinder",
    3. ...
    4. srcs: [
    5. "ActivityManager.cpp",
    6. "AppOpsManager.cpp",
    7. "Binder.cpp",
    8. "BpBinder.cpp",
    9. "BufferedTextOutput.cpp",
    10. "Debug.cpp",
    11. "IActivityManager.cpp",
    12. "IAppOpsCallback.cpp",
    13. "IAppOpsService.cpp",
    14. "IBatteryStats.cpp",
    15. "IInterface.cpp",
    16. "IMediaResourceMonitor.cpp",
    17. "IMemory.cpp",
    18. "IPCThreadState.cpp",
    19. "IPermissionController.cpp",
    20. "IProcessInfoService.cpp",
    21. "IResultReceiver.cpp",
    22. "IServiceManager.cpp",
    23. "IShellCallback.cpp",
    24. "IUidObserver.cpp",
    25. "MemoryBase.cpp",
    26. "MemoryDealer.cpp",
    27. "MemoryHeapBase.cpp",
    28. "Parcel.cpp",
    29. "ParcelFileDescriptor.cpp",
    30. "PermissionCache.cpp",
    31. "PermissionController.cpp",
    32. "PersistableBundle.cpp",
    33. "ProcessInfoService.cpp",
    34. "ProcessState.cpp",
    35. "Static.cpp",
    36. "Status.cpp",
    37. "TextOutput.cpp",
    38. "IpPrefix.cpp",
    39. "Value.cpp",
    40. ":libbinder_aidl",
    41. ],
    42. ...
    43. }

    ndk 工程 libbinder_ndk 

    1. cc_library {
    2. name: "libbinder_ndk",
    3. ...
    4. srcs: [
    5. "ibinder.cpp",
    6. "ibinder_jni.cpp",
    7. "parcel.cpp",
    8. "process.cpp",
    9. "status.cpp",
    10. "service_manager.cpp",
    11. ],
    12. shared_libs: [
    13. "libandroid_runtime_lazy",
    14. "libbase",
    15. "libbinder",
    16. "libutils",
    17. ],
    18. ...
    19. }
    20. ndk_library {
    21. name: "libbinder_ndk",
    22. symbol_file: "libbinder_ndk.map.txt",
    23. first_version: "29",
    24. }

    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

  • 相关阅读:
    信息学奥赛一本通:2029:【例4.15】水仙花数
    springboot+websocket聊天室(私聊+群聊)
    ros2 代码风格检查
    【JavaScript速成】2.JavaScript的四个内置对象:字符串对象、数组对象、时间对象、数学对象
    Vue项目后台部分2,文件夹介绍,登录页面,路由的搭建,品牌管理页面使用element-ui动态展示
    小县城蔬菜配送小程序制作全攻略
    请求分页中的内存分配
    你们公司每次迭代周期多久?加班多么?
    板凳-------unix 网络编程 卷1-1简介
    Java版本+企业电子招投标系统源代码+支持二开+招投标系统+中小型企业采购供应商招投标平台
  • 原文地址:https://blog.csdn.net/ykun089/article/details/133985363
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号