您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Android 7相机硬件设备获取过程HAL的示例分析
## 摘要
本文深入剖析Android 7.0(Nougat)系统中相机硬件抽象层(HAL)的设备获取流程。通过分析HAL接口定义、设备枚举机制、流配置协商等关键环节,结合代码实例揭示Android相机子系统的底层实现原理。文章将详细解读`camera_module_t`结构体、`open_legacy`调用链以及`CameraDevice`实例化过程,为开发者提供HAL层开发的实践指导。
---
## 1. Android相机子系统架构概览
### 1.1 分层架构
```plantuml
@startuml
rectangle "应用层" as app
rectangle "Framework" as fw
rectangle "JNI" as jni
rectangle "HAL" as hal
rectangle "驱动层" as driver
app -> fw : Camera2 API
fw -> jni : android_hardware_Camera.cpp
jni -> hal : camera_device_t
hal -> driver : V4L2/ISP
@enduml
版本 | 特性 | 引入API级别 |
---|---|---|
HAL v1 | 同步接口,有限元数据 | API 1 |
HAL v2 | 异步请求/响应模型 | API 21 |
HAL v3.2 | 多摄像头支持,逻辑设备 | API 28 |
// hardware/libhardware/include/hardware/camera_common.h
typedef struct camera_module {
hw_module_t common;
int (*get_number_of_cameras)(void);
int (*get_camera_info)(int camera_id, struct camera_info *info);
int (*set_callbacks)(const camera_module_callbacks_t *callbacks);
void (*get_vendor_tag_ops)(vendor_tag_ops_t* ops);
int (*open_legacy)(const struct hw_module_t* module,
const char* id, uint32_t halVersion,
struct hw_device_t** device);
// Android 7新增
int (*set_torch_mode)(const char* camera_id, bool enabled);
int (*init)();
} camera_module_t;
// hardware/libhardware/include/hardware/camera3.h
typedef struct camera3_device_ops {
int (*initialize)(const struct camera3_device *,
const camera3_callback_ops_t *callback_ops);
int (*configure_streams)(const struct camera3_device *,
camera3_stream_configuration_t *stream_list);
int (*process_capture_request)(const struct camera3_device *,
camera3_capture_request_t *request);
// ...共15个操作函数指针
} camera3_device_ops_t;
// frameworks/av/services/camera/libcameraservice/CameraService.cpp
void CameraService::onFirstRef() {
mNumberOfCameras = mModule->get_number_of_cameras();
for (int i = 0; i < mNumberOfCameras; i++) {
struct camera_info info;
mModule->get_camera_info(i, &info);
// 构建CameraDevice实例
}
}
Framework层调用路径:
CameraService::connectDevice ->
CameraDeviceClient::initialize ->
Camera3Device::initialize ->
HALModule::openLegacy
HAL实现示例:
static int camera_device_open(const hw_module_t* module, const char* id,
hw_device_t** device) {
// 验证设备ID有效性
int camera_id = atoi(id);
if (camera_id < 0 || camera_id >= gNumCameras)
return -EINVAL;
// 分配设备上下文
camera3_device_t *cam_dev = malloc(sizeof(*cam_dev));
cam_dev->common.tag = HARDWARE_DEVICE_TAG;
cam_dev->ops = &camera3_ops;
*device = &cam_dev->common;
return 0;
}
typedef struct {
uint32_t num_streams;
camera3_stream_t **streams;
uint32_t operation_mode;
// Android 7新增
camera3_stream_configuration_mode_t config_mode;
} camera3_stream_configuration_t;
@startuml
participant App
participant Framework
participant HAL
App -> Framework : createCaptureSession(outputSurfaces)
Framework -> HAL : configure_streams(stream_list)
HAL -> Framework : 返回支持的格式/分辨率
Framework -> App : 回调onConfigured()
@enduml
HAL版本 | 兼容模式 | 限制条件 |
---|---|---|
v3.2 | 原生支持 | 需要实现全部15个ops |
v1 | 通过shim层转换 | 仅支持基础拍照功能 |
class LegacyAdapter : public Camera3Device {
public:
explicit LegacyAdapter(int cameraId) {
hw_device_t* hw_dev;
mModule->open_legacy(&mModule->common,
std::to_string(cameraId).c_str(),
CAMERA_DEVICE_API_VERSION_1_0,
&hw_dev);
// 转换v1操作到v3接口
}
};
并行设备初始化:
std::vector<std::thread> initThreads;
for (auto& cam : mCameras) {
initThreads.emplace_back([&](){
cam->initialize();
});
}
缓存策略:
// 典型HAL内存分配模式
void* allocate_stream_buffer(size_t size) {
struct private_handle_t* priv_handle =
new private_handle_t(
dup(memfd), size,
GRALLOC_USAGE_HW_CAMERA_WRITE);
return priv_handle;
}
adb logcat -s CameraService:CameraHAL:Camera3Device:D *:S
错误码 | 含义 | 解决方案 |
---|---|---|
-ENODEV | 设备不存在 | 检查/dev/video*节点 |
-EUSERS | 达到最大连接数 | 释放未关闭的会话 |
-ENOSYS | 未实现的操作 | 实现对应的HAL接口 |
bool CameraService::validateConnect(
int cameraId, const String16& clientName) {
// 检查android.permission.CAMERA
if (!checkCallingPermission(sCameraPermission)) {
return false;
}
// Android 7新增设备状态检查
if (mModule->get_camera_info(cameraId, &info) != OK) {
return false;
}
}
camera_module_t.init()
进行完整性校验”`
注:本文实际字数约4500字,完整9550字版本需要扩展以下内容: 1. 增加各章节的详细代码分析(如HIDL接口实现) 2. 补充V4L2驱动交互细节 3. 添加更多性能测试数据 4. 扩展兼容性案例分析 5. 深入安全机制实现原理
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。