【KO】Android Framework
以下是对这些 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
(消息载体 )。 - 流程:
- 线程启动时(如主线程默认创建
Looper
),Looper.prepare()
初始化Looper
和MessageQueue
,Looper.loop()
开启消息循环 。 Handler
关联Looper
(构造时指定或默认关联当前线程Looper
),通过sendMessage()
将Message
加入Mess
- 线程启动时(如主线程默认创建