深入理解相机体系 四 相机服务层 FWK

4dc0a0d792645a8ef5c47abe5eddb3ab.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、简介
二、Camera AIDL 接口
三、Camera Service 主程序

相机服务层

一、简介

Camera Service被设计成一个独立进程,作为一个服务端,处理来自Camera Framework 客户端的跨进程请求,并在内部进行一定的操作,随后作为客户端将请求再一次发送至作为服务端的Camera Provider,整个流程涉及到了两个跨进程操作,前者通过AIDL机制实现,后者通过HIDL机制实现,由于在于Camera Provider通信的过程中,Service是作为客户端存在的,所以此处我们重点关注AIDL以及Camera Service 主程序的实现。

fc42a1a459d106f503aa4b3b8b309d45.png

程序Android 转于网络图片

二、Camera AIDL 接口

在介绍Camera AIDL之前,不妨来简单了解下何为AIDL,谷歌为什么要实现这么一套机制?

在Android系统中,两个进程通常无法相互访问对方的内存,为了解决该问题,谷歌提出了Messager/广播以及后来的Binder,来解决这个问题,但是如果某个进程需要对另一个进程中进行多线程的并发访问,Messager和广播效果往往不是很好,所以Binder会作为主要实现方式,但是Binder的接口使用起来比较复杂,对开发者特别是初学者并不是很友好,所以为了降低跨进程开发门槛,谷歌开创性地提出了AIDL(自定义语言)机制,主动封装了Binder的实现细节,提供给开发者较为简单的使用接口,极大地提升了广大开发者的开发效率。

按照谷歌的针对AIDL机制的要求,需要服务端创建一系列*.aidl文件,并在其中定义需要提供给客户端的公共接口,并且予以实现,接下来我们来看下几个主要的aidl文件。

3899359af0a8dcebe163b43174bd9eef.png

程序Android 转于网络图片

ICameraService.aidl定义了ICameraService 接口,实现主要通过CameraService类来实现,主要接口如下:

  • getNumberOfCameras:获取系统中支持的Camera 个数

  • connectDevice():打开一个Camera 设备

  • addListener(): 添加针对Camera 设备以及闪光灯的监听对象

ICameraDeviceCallbacks.aidl文件中定义了ICameraDeviceCallbacks接口,其实现主要由Framework中的CameraDeviceCallbacks类进行实现,主要接口如下:

  • onResultReceived:一旦Service收到结果数据,便会调用该接口发送至Framework

  • onCaptureStarted():一旦开始进行图像的采集,便调用该接口将部分信息以及时间戳上传至Framework

  • onDeviceError(): 一旦发生了错误,通过调用该接口通知Framework

ICameraDeviceUser.aidl定义了ICameraDeviceUser接口,由CameraDeviceClient最终实现,主要接口如下:

  • disconnect:关闭Camera 设备

  • submitRequestList:发送request

  • beginConfigure:开始配置Camera 设备,需要在所有关于数据流的操作之前

  • endConfigure:结束关于Camera 设备

在IT领域中,**FWK** 是 **Framework** 的缩写,通常用于指代软件开发中的“框架”。框架是一种为构建应用程序提供基础结构和通用功能的可重用设计。它为开发者提供了一组标准化的接口、类库、工具和规范,简化了应用开发流程并提高了代码的可维护性和扩展性。 ### FWK 在不同技术场景下的常见用途 #### 1. 软件开发框架 在应用程序开发中,FWK 提供了特定语言或平台下的开发环境支持。例如: - **Android Framework**:为 Android 应用开发提供了核心组件如 `Activity`、`Service`、`ContentProvider` 和 `BroadcastReceiver`,以及系统服务如 `WindowManager`、`PackageManager` 等[^1]。 - **Spring Framework**:Java 开发中最流行的后端框架之一,提供了依赖注入(DI)、面向切面编程(AOP)、数据访问抽象等功能。 ```java // Spring Framework 示例:定义一个简单的 Bean @Component public class HelloWorld { public String getMessage() { return "Hello, World!"; } } ``` #### 2. 测试框架 FWK 也广泛应用于自动化测试领域,例如: - **JUnit**:Java 单元测试的标准框架。 - **PyTest**:Python 中常用的测试框架,支持函数式和基于类的测试结构。 ```python # PyTest 示例 def test_addition(): assert 1 + 1 == 2 ``` #### 3. Web 开发框架 在前端与后端 Web 开发中,FWK 提供了快速构建网站和 API 的能力。 - **React.js**:用于构建用户界面的 JavaScript 前端框架。 - **Django**:Python 编写的高级 Web 框架,支持快速开发和清晰的设计模式。 ```javascript // React 示例组件 function Welcome(props) { return <h1>Hello, {props.name}</h1>; } ``` #### 4. 机器学习与深度学习框架 在人工智能领域,FWK 提供了算法实现、模型训练与部署的支持。 - **TensorFlow**:Google 开发的开源深度学习框架,支持 GPU 加速和分布式计算。 - **Scikit-learn**:Python 中用于数据挖掘和数据分析的经典机器学习库。 ```python # Scikit-learn 示例:使用 KMeans 聚类 from sklearn.cluster import KMeans import numpy as np X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]]) kmeans = KMeans(n_clusters=2, random_state=0).fit(X) print("Labels:", kmeans.labels_) ``` #### 5. 系统与中间件框架 FWK 还可用于构建底层系统服务或通信中间件,如: - **Apache Kafka**:虽然本身是消息队列系统,但其生态中包含多个框架用于流处理。 - **ROS (Robot Operating System)**:机器人开发中的框架,提供了硬件抽象、进程间通信、包管理等机制。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值