说一说 oneway 吧,了解过这个修饰符作用吗?原理是什么?怎么理解单向调用?

面试官提了一个问题,我们来看看 A、B 和 C 三位同学的表现如何吧


A

面试官️:看你简历上写熟悉 AIDL,说一说 oneway 吧

A:oneway 是什么?跟 AIDL 没关系吧,我熟悉 AIDL 指的是使用 AIDL 接口进行跨进程通信。

面试官:AIDL 接口的方法可以用 oneway 修饰符来修饰,了解过这个修饰符的作用吗?

A:可以提高性能吗?我觉得没必要使用,我从没用过,程序也跑的好好的,没出过什么问题。

面试官:好的,回去等通知吧


B

面试官:看你简历上写熟悉 AIDL,说一说 oneway 吧

B:用 oneway 修饰的 AIDL 接口方法,是单向调用,不需要等待另一个进程的返回结果,所以方法的返回类型也只允许是 void.

面试官:怎么理解 "单向调用" ,有了解过它的实现原理吗?

B:由应用进程到服务进程是通过 binder 驱动进行 IPC 通信的,单向的意思应该是应用进程只向 binder 驱动发送一次数据就结束返回,不再等待回复数据;而不用 oneway 修饰的方法需要等待 binder 驱动与服务端通信完后,再回复数据给应用端。

面试官:只向 binder 驱动发送数据吗?binder 驱动有没有回复应用?

B:嗯... 我理解的是既然不需要返回值,所以没有回复吧

面试官:好的,回去等通知吧


C

面试官:看你简历上写熟悉 AIDL,说一说 oneway 吧

C:oneway 主要有两个特性:异步调用和串行化处理。异步调用是指应用向 binder 驱动发送数据后不需要挂起线程等待 binder 驱动的回复,而是直接结束。像一些系统服务调用应用进程的时候就会使用 oneway,比如 AMS 调用应用进程启动 Activity,这样就算应用进程中做了耗时的任务,也不会阻塞系统服务的运行。

串行化处理是指对于一个服务端的 AIDL 接口而言,所有的 oneway 方法不会同时执行,binder 驱动会将他们串行化处理,排队一个一个调用。

面试官:有了解过相关的 binder 协议吗?

C:了解过,图会更直观一些,我来画一下图吧,首先是非 oneway 的情况:

如果是 oneway 的话,客户端就不需要挂起线程等待:

涉及到的 binder 命令也有规律,由外部发送给 binder 驱动的都是 BC_ 开头,由 binder 驱动发往外部的都是 BR_开头。

面试官:怎么理解客户端线程挂起等待呢?有没有实际占用 CPU 的调度?

C:这里的挂起相当于 Thread 的 sleep,是真正的"休眠",底层调用的是 wait_event_interruptible() Linux 系统函数。

面试官:你是从哪里了解到 wait_event_interruptible() 函数的呢?

C:在学习 Handler 机制的时候,Handler 中最关键的地方就是 Looper 的阻塞与唤醒,阻塞是调用了 nativePollOnce() 方法,当时对它的底层实现感兴趣,就去了解了一下,也学习到 Linux 用来实现阻塞/唤醒的 select、poll 和 epoll 机制

面试官:可以,我们再来聊聊别的。



作者:字节走动_Android
链接:https://www.jianshu.com/p/133def697c24
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

<think> 嗯,用户这次的问题聚焦在“框架层”的定义上,特别要求结合AOSP/HIDL/AIDL的语境来理解。看来ta之前对整体架构有了基本认知,现在想深入框架层的具体范畴。 回顾之前的讨论,我在解释AOSP架构时提到过框架层位于Java API层,但用户显然需要更精准的界定。这里的关键是厘清两个维度:一是技术层级(框架层在Android系统的位置),二是功能边界(哪些组件属于框架层)。 用户可能正在开发系统应用或定制ROM,需要明确代码应该写在哪个层级。从ta追问的精准度看,应该是具备一定Android开发经验的工程师,但可能对系统底层交互不熟悉。 需要特别注意:框架层在HIDL和AIDL语境下的差异。HIDL主要面向HAL层,而AIDL更多用于框架层内部通信。这个区别在官方文档中容易混淆,必须结合具体代码示例说明。 最核心的区分点在于服务类型:系统级服务(如CameraService)属于框架层,通过AIDL暴露接口;而硬件抽象服务(如CameraProvider)属于HAL层,通过HIDL通信。这个界限恰恰是很多开发者困惑的地方。 用户没有要求扩展国产化适配的内容,但考虑到之前对话提到过NPU加速,在总结部分可以稍作关联,展示框架层定制对硬件加速的影响,这样能形成知识闭环。 </think> 在 Android 系统架构中,**框架层(Framework Layer)** 是 AOSP、HIDL 和 AIDL 相关讨论的核心层级。以下是其明确定义与技术解析: --- ### **1. 框架层的定义与范围** - **官方定位**:位于 Android 五层架构中的 **Java API 框架层**(紧邻应用层下方),是系统服务的运行载体[^1]。 - **核心组成**: $$ \text{框架层} = \left\{ \begin{array}{l} \text{系统服务(如 ActivityManagerService)} \\ \text{API 接口(如 android.\* 包下的类)} \\ \text{跨进程通信机制(Binder/AIDL)} \end{array} \right. $$ --- ### **2. 三者在框架层中的角色** #### **(1) AOSP 与框架层** - **关系**:AOSP **提供**框架层的实现代码(如 `frameworks/base/services` 目录)。 - **作用**: - 实现四大组件(Activity/Service 等)的生命周期管理 - 提供系统服务(如 `WindowManagerService`) - 封装硬件能力(通过 HAL 接口调用底层驱动)[^2] #### **(2) AIDL 与框架层** - **定位**:框架层**内部通信**的核心工具。 - **作用场景**: ```mermaid graph LR A[应用进程] -- AIDL --> B[系统服务进程] B[系统服务] -- AIDL --> C[其他系统服务] ``` - 应用通过 AIDL 调用系统服务(如 `getSystemService( CAMERA_SERVICE )`) - 系统服务间通过 AIDL 协同(如 `PackageManagerService` 与 `ActivityManagerService`) - **关键特性**:支持异步 `oneway` 调用,避免主线程阻塞[^1] #### **(3) HIDL 与框架层** - **交互方式**:框架层通过 HIDL **向下访问 HAL 层**。 - **数据流**: $$ \text{框架层} \xrightarrow{\text{HIDL 接口}} \text{HAL 层} \xrightarrow{\text{驱动}} \text{硬件} $$ - 示例:`CameraService` 通过 HIDL 调用 `ICameraProvider` 操作摄像头硬件 - **解耦价值**:框架层升级无需重写 HAL 实现(接口通过 `hwservicemanager` 动态绑定)[^1] --- ### **3. 框架层的核心特性** | **特性** | **技术实现** | **作用** | |------------------|----------------------------------|-----------------------------------| | **跨进程通信** | Binder 驱动 + AIDL 接口 | 实现系统服务与应用的隔离 | | **硬件抽象** | HIDL 接口 + HAL 实现 | 屏蔽硬件差异(如不同厂商的传感器)| | **系统服务管理** | `ServiceManager` 注册/发现机制 | 统一管理服务生命周期 | --- ### **4. 典型交互流程(以相机为例)** ```mermaid sequenceDiagram 应用层->>+CameraManager (框架层): 1. openCamera() CameraManager->>+CameraService (框架层): 2. AIDL 调用 connect() CameraService->>+ICameraProvider (HAL): 3. HIDL 调用 getCamera() ICameraProvider-->>-CameraService: 4. 返回 CameraDevice CameraService-->>-应用层: 5. 返回 Camera 对象 ``` 1. **框架层内部调用**:步骤 2 通过 AIDL 跨进程通信 2. **框架层与 HAL 层交互**:步骤 3 通过 HIDL 实现 --- ### **5. 演进趋势:AIDL 统一化** Android 10 起引入 **AIDL for HAL**,逐步替代 HIDL: - **优势**: - 减少 IPC 机制碎片化(AIDL 同时支持应用层与 HAL 层) - 简化接口定义语法(对比 HIDL 的 C++ 风格语法) - **现状**:新硬件(如 NPU)推荐直接使用 AIDL 定义 HAL 接口[^1] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值