由于camera 1网上大家分析的文章比较多,这里就截取各处细节在做继续深究.
前段部分流程可以看:Android Camera 流程学习记录(二)—— Camera Open 调用流程,这里分析CameraService.cpp以下部分.
1.C/C++ 层:
1.1 CameraService.cp
- 位置:
frameworks/av/services/camera/libcameraservice/CameraService.cpp
connect()
:- 注意这里真正实现逻辑是在
connectHelper()
函数中。 - 获得一个客户端实例并且通过
*device
返回。
- 注意这里真正实现逻辑是在
上面分析得知,Java 层中会通过 binder 跨进程调用 CameraService::connect(), camera2 会调用到CameraService::connectDevice(),注意里面connectHelper的参数API_1, camera2会对应API_2,
Status CameraService::connect(
const sp<ICameraClient>& cameraClient,
int cameraId,
const String16& clientPackageName,
int clientUid,
int clientPid,
/*out*/
sp<ICamera>* device) {
ATRACE_CALL();
Status ret = Status::ok();
String8 id = String8::format("%d", cameraId);
sp<Client> client = nullptr;
ret = connectHelper<ICameraClient,Client>(cameraClient, id,
CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageName, clientUid, clientPid, API_1,
/*legacyMode*/ false, /*shimUpdateOnly*/ false,
/*out*/client);
if(!ret.isOk()) {
logRejected(id, getCallingPid(), String8(clientPackageName),
ret.toString8());
return ret;
}
*device = client;
return ret;
}
CameraService.h
位置:frameworks/av/services/camera/libcameraservice/CameraService.h
注意这个文件中定义了 CameraService::Client 类,这个类通过它的子类 CameraClient 真正实现了 ICamera 的接口。
connectHelper():
- HAL1 /HAL2 最终也都调用到这个方法
- 这个函数实现比较长,截取其中的一段。
- 首先,如果客户端实例已经存在于 MediaRecorder ,则直接将其取出返回。
- 若不存在,则先获取 deviceVersion,然后再调用 makeClient() 函数创建一个客户端。
- 创建客户端后,需要调用其 initialize() 函数进行初始化,注意其传入的参数是 mModule,这个参数是连接 Libraries 与 HAL 的关键参数。
template<class CALLBACK, class CLIENT>
Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8& cameraId,
int halVersion, const String16& clientPackageName, int clientUid, int clientPid,
apiLevel effectiveApiLevel, bool legacyMode, bool shimUpdateOnly,
/*out*/sp<CLIENT>& device) {
...
sp<BasicClient> tmp = nullptr;
ALOGE("%s halVersion = %d , deviceVersion = %d ", __FUNCTION__, halVersion, deviceVersion);
/* makeClient() 很重要, 后面分析 */
if(!(ret = makeClient(this, cameraCb, clientPackageName, cameraId, facing, clientPid,
clientUid, getpid(), legacyMode, halVersion, deviceVersion, effectiveApiLevel,
/*out*/&tmp)).isOk()) {
return ret;
}
client = static_cast<CLIENT*>(tmp.get());
LOG_ALWAYS_FATAL_IF(client.get() == nullptr, "%s: CameraService in invalid state",
__FUNCTION__);
err = client->initialize(mCameraProviderManager);
...
device = client;
return ret;
}
makeClent:
Status CameraService::makeClient(const sp<CameraService>& cameraService,
const sp<IInterface>& cameraCb, const String16& packageName, const String8& cameraId,
int facing, int clientPid, uid_t clientUid, int servicePid, bool legacyMode,
int halVersion, int deviceVersion, apiLevel effectiveApiLevel,
/*out*/sp<BasicClient>* client) {
...
if (halVersion < 0 || halVersion == deviceVersion) {
// Default path: HAL version is unspecified by caller, create Came