前言
之前准备按照camera APP调用API1/2的接口一点点的写代码流程。本地写了几篇之后发现不把camera server和hal的初始化写完,直接开始写API调用流程的话不太好写。还是从服务的初始化开始写吧。代码流程分析
我就按照自己习惯的学习一个新的模块的思路来写。
先通过ps命令看一下当前camera hal运行的进程叫什么。
cameraserver 946 1 0 S android.hardware.camera.provider@2.4-service_64
从手机运行的进程看,当前运行的camera Hal是android.hardware.camera.provider@2.4-service_64
根据这个名称再到代码里面搜一下,定义在hardware/interfaces/camera/provider/2.4/default/Android.bp中。
cc_binary {
name: "android.hardware.camera.provider@2.4-service_64",
defaults: ["camera_service_defaults"],
compile_multilib: "64",
init_rc: ["android.hardware.camera.provider@2.4-service_64.rc"],
}
使用了android.hardware.camera.provider@2.4-service_64.rc,rc文件没啥好分析的,就是告诉init进程该去哪里以什么方式启动什么进程。
看下rc的内容:
service vendor.camera-provider-2-4 /vendor/bin/hw/android.hardware.camera.provider@2.4-service_64
interface android.hardware.camera.provider@2.4::ICameraProvider legacy/0
class hal
user cameraserver
group audio camera input drmrpc
ioprio rt 4
capabilities SYS_NICE
task_profiles CameraServiceCapacity HighPerformance
defaults: [“camera_service_defaults”]编译相关
cc_defaults {
name: "camera_service_defaults",
defaults: ["hidl_defaults"],
proprietary: true,
relative_install_path: "hw",
srcs: ["service.cpp"],
...
从srcs: [“service.cpp”]可以看出,android.hardware.camera.provider@2.4-service_64主要就是用这个cpp编译生成的。再来看看service.cpp。
#ifdef LAZY_SERVICE
const bool kLazyService = true;
#else
const bool kLazyService = false;
#endif
int main()
{
ALOGI("CameraProvider@2.4 legacy service is starting.");
// The camera HAL may communicate to other vendor components via
// /dev/vndbinder
android::ProcessState::initWithDriver("/dev/vndbinder");
status_t status;
if (kLazyService) {
status = defaultLazyPassthroughServiceImplementation<ICameraProvider>("legacy/0",
/*maxThreads*/ 6);
} else {
status = defaultPassthroughServiceImplementation<ICameraProvider>("legacy/0",
/*maxThreads*/ 6);
}
return status;
}
LAZY_SERVICE的宏不确定是不是被定义了,再回去看看android.bp
cc_binary {
name: "android.hardware.camera.provider@2.4-service-lazy",
overrides: ["android.hardware.camera.provider@2.4-service"],
defaults: ["camera_service_defaults"],
compile_multilib: "32",
init_rc: ["android.hardware.camera.provider@2.4-service-lazy.rc"],
cflags: ["-DLAZY_SERVICE"],
}
cc_binary {
name: "android.hardware.camera.provider@2.4-service-lazy_64",
overrides: ["android.hardware.camera.provider@2.4-service_64"],
defaults: ["camera_service_defaults"],
compile_multilib: "64",
init_rc: ["android.hardware.camera.provider@2.4-service-lazy_64.rc"],
cflags: ["-DLAZY_SERVICE"],
}
只找到了上面两处定义LAZY_SERVICE的地方,所以这里kLazyService 肯定是false了。最终会调用defaultPassthroughServiceImplementation
这就是注册hidl服务,调用到system/libhidl/transport/include/hidl/LegacySupport.h中。
template <class Interface, class ExpectInterface = Interface>
__attribute__((warn_unused_result)) status_t defaultPassthroughServiceImplementation(
const std::string& name, size_t maxThreads = 1) {
configureRpcThreadpool(maxThreads, true);
status_t result = registerPassthroughServiceImplementation<Interface, ExpectInterface>(name);
if (result != OK) {
return result;
}
joinRpcThreadpool();
return UNKNOWN_ERROR;
}
调用registerPassthroughServiceImplementation
template <class Interface, class ExpectInterface = Interface>
__attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(
const std::string& name = "default") {
return registerPassthroughServiceImplementation(Interface::descriptor,
ExpectInterface::descriptor, name);
}
调用registerPassthroughServiceImplementation
__attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(
const std::string& interfaceName, const std::string& expectInterfaceName,
const std::string& serviceName) {
return details::registerPassthroughServiceImplementation(
interfaceName, expectInterfaceName,
[](const sp<IBase>& service, const std::string& name) {
return details::registerAsServiceInternal(service, name);
},
serviceName);
}
调用registerPassthroughServiceImplementation
__attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(
const std::string& interfaceName, const std::string& expectInterfaceName,
RegisterServiceCb registerServiceCb, const std::string& serviceName) {
sp<IBase> service =
getRawServiceInternal(interf