【KO】Android Framework

发布于:2025-08-16 ⋅ 阅读:(15) ⋅ 点赞:(0)

以下是对这些 Android Framework 相关问题的解答:

1. Binder 有什么优势

  • 高效:基于内存映射(MMAP ),相比传统 IPC(如 Socket )减少数据拷贝次数(一次拷贝 ),提升通信效率 。
  • 安全:自带 UID/PID 校验机制,能识别调用者身份,保障进程间通信安全,Android 权限控制依赖此 。
  • 易用:Android 封装了 Binder 框架(如 AIDL ),开发者无需关注底层实现,简单编写接口就能实现跨进程通信 。
  • 灵活:支持同步、异步调用,可根据场景(如获取实时数据用同步,后台任务用异步 )灵活选择 。

2. Binder 是如何做到一次拷贝的

  • 传统 IPC(如管道 )数据传输需两次拷贝:发送方进程将数据从用户空间拷贝到内核空间,接收方进程再从内核空间拷贝到用户空间 。
  • Binder 利用 MMAP 内存映射 优化:内核空间与接收方进程用户空间通过 MMAP 建立映射,发送方进程只需把数据拷贝到内核空间的 Binder 驱动缓冲区,接收方进程因内存映射,可直接访问该缓冲区数据,无需二次拷贝,实现 “一次拷贝” 完成跨进程数据传递 。

3. MMAP 的内存映射原理了解吗

  • 定义:MMAP 是一种内存映射文件机制,将磁盘文件映射到进程虚拟地址空间,使进程可像访问内存一样操作文件 。
  • 原理
    • 进程调用 mmap() ,内核在进程虚拟内存分配一块地址空间,建立虚拟地址与磁盘文件的映射关系 。
    • 首次访问映射地址时,触发缺页异常,内核将磁盘文件对应内容加载到物理内存,后续进程通过虚拟地址直接操作物理内存(实际由内核管理磁盘与物理内存的数据同步 )。
  • 作用:减少 I/O 操作,实现高效文件读写;Binder 跨进程通信借助其实现一次拷贝,提升性能 。

4. Binder 机制是如何跨进程的

  • 组件构成:包含 Binder 驱动(内核层,负责进程间通信调度、数据转发 )、服务端 Binder 实体(暴露服务接口,如 Binder 子类 )、客户端 Binder 代理(持有服务端引用,封装跨进程调用 )。
  • 流程
    • 服务端通过 addService() 将 Binder 实体注册到 ServiceManager(系统服务,管理 Binder 服务 )。
    • 客户端向 ServiceManager 查询服务,获取 Binder 代理(Proxy )。
    • 客户端通过代理调用方法时,方法参数被封装成 Binder 协议数据,发送到内核 Binder 驱动 。
    • Binder 驱动根据代理找到实际服务端 Binder 实体,转发请求并执行 。
    • 执行结果按原路返回客户端,完成跨进程通信 。

5. 说说四大组件的通信机制

  • Activity:通过 Intent 启动,由 ActivityManagerService(AMS ) 调度。启动时,客户端进程向 AMS 发送 Intent 请求,AMS 校验权限、查找目标 Activity 所在进程,若进程未启动则创建,最终通过 ActivityThread 调度 Activity 生命周期 。
  • Service:分启动式(startService )和绑定式(bindService ),均由 AMS 管理。启动/绑定请求先到 AMS,AMS 负责创建 Service(进程不存在则创建 )、调度 onStartCommand/onBind 等生命周期方法 。
  • BroadcastReceiver:发送广播时,客户端进程将广播 Intent 交给 AMS,AMS 根据 IntentFilter 匹配接收者,调度 onReceive 方法(静态广播需先解析清单文件,动态广播直接匹配注册的接收器 )。
  • ContentProvider:注册时向 AMS 报备,客户端通过 ContentResolver 发起跨进程调用,AMS 找到对应 ContentProvider 所在进程,通过 Binder 调用 query/insert 等方法,底层依赖 Binder 通信 。

6. HandlerThread 是什么?为什么它会存在?

  • 是什么HandlerThread 是 Android 封装的 带 Looper 的线程类,继承 Thread 。内部自动创建 Looper 和消息队列,提供 getLooper() 方法,方便关联 Handler 实现线程内消息循环 。
  • 存在原因
    • 手动创建线程 + Looper 需编写 Looper.prepare()Looper.loop() 等代码,易出错 。
    • HandlerThread 封装了线程与 Looper 的绑定逻辑,简化后台线程消息循环开发(如定时任务、串行网络请求 ),让开发者专注业务逻辑 。

7. 简述下 Handler 机制的总体原理?

  • 组件Handler(发消息、处理消息 )、Looper(管理消息队列,循环取消息 )、MessageQueue(存储消息 )、Message(消息载体 )。
  • 流程
    1. 线程启动时(如主线程默认创建 Looper ),Looper.prepare() 初始化 LooperMessageQueueLooper.loop() 开启消息循环 。
    2. Handler 关联 Looper(构造时指定或默认关联当前线程 Looper ),通过 sendMessage()Message 加入 Mess

网站公告

今日签到

点亮在社区的每一天
去签到