https://deepinout.com/android-camera-native-framework/cameraserver-process-manifest-in-details-2.html
1 manifest.hal.version
manifest.hal.version 用于指定使用的HAL版本,决定使用哪个版本的接口
1.1 HIDL 的 hal 版本
格式:MAJOR.MINOR
示例:
/frameworks/av/camera/cameraserver/manifest_android.frameworks.cameraservice.service@2.2.xml
<manifest version="1.0" type="framework">
<hal>
<name>android.frameworks.cameraservice.service</name>
<transport>hwbinder</transport>
<version>2.2</version>
<interface>
<name>ICameraService</name>
<instance>default</instance>
</interface>
</hal>
</manifest>
其中 <version>2.2</version> 表示实现的HAL接口为2.2版本。
1.2 HIDL 的 hal 版本
格式:一个整数
示例: AIDL HAL:Android 13
/hardware/google/camera/common/hal/aidl_service/android.hardware.camera.provider@2.7-service-google.xml
2 manifest.hal.interface
指明HAL包中具有实例名称的接口。一个 hal 中可以有多个 interface 元素,但名称必须不同。
manifest.hal.interface.name:接口的名称
manifest.hal.interface.instance:实例名称,一个接口可以有多个实例,,但不能有重复的 <instance> 元素。
<manifest version="1.0" type="framework">
<hal>
<name>android.frameworks.cameraservice.service</name>
<transport>hwbinder</transport>
<version>2.2</version>
<interface>
<name>ICameraService</name>
<instance>default</instance>
</interface>
</hal>
</manifest>
hal 接口的前缀 = 包名 + 接口名 + 实例名
3 manifest.hal.fqname
FQName(完全限定软件包名称,Fully qualified package name)。
3.1 HIDL fqname
格式: @MAJOR.MINOR::INTERFACE/INSTANCE
将版本、接口、实例整合在一起了
示例:/device/generic/goldfish/manifest.camera.xml
<manifest version="1.0" type="device" target-level="3">
<hal format="hidl">
<name>android.hardware.camera.provider</name>
<transport>hwbinder</transport>
<fqname>@2.4::ICameraProvider/legacy/0</fqname>
</hal>
</manifest>
示例:/frameworks/av/drm/mediadrm/plugins/clearkey/aidl/android.hardware.drm-service.clearkey.xml
3.2 AIDL fpname
格式: INTERFACE/INSTANCE
<manifest version="1.0" type="device">
<hal format="aidl">
<name>android.hardware.drm</name>
<version>1</version>
<fqname>IDrmFactory/clearkey</fqname>
</hal>
</manifest>
4 HAL Interface Descriptor
4.1 Descriptor是interface的完整的实例名。
- ICameraService HIDL HAL
const char* ICameraService::descriptor("android.frameworks.cameraservice. \
service@2.2::ICameraService");
- ICameraProvider HIDL HAL
const char* ICameraProvider::descriptor("android.hardware. \
camera.provider@2.7::ICameraProvider");
- ICameraProvider AIDL HAL
const char* ICameraProvider::descriptor ("android.hardware.camera. \
provider.ICameraProvider)";
4.2 通过ServiceManager获取Service 实例时要传完整的实例名
实例: HIDL
/frameworks/av/camera/ndk/ndk_vendor/impl/ACameraManager.cpp
sp<ICameraService> cameraServiceBinder;
do {
cameraServiceBinder = ICameraService::getService();
if (cameraServiceBinder != nullptr) {
break;
}
ALOGW("CameraService not published, waiting...");
usleep(kCameraServicePollDelay);
} while(true);
// getService() 没有传入参数, 默认是传入default 实例
实例: AIDL
status_t CameraProviderManager::tryToAddAidlProvidersLocked() {
// 获取 descriptor
const char * aidlHalServiceDescriptor =
aidl::android::hardware::camera::provider::ICameraProvider::descriptor;
auto sm = defaultServiceManager();
auto aidlProviders = sm->getDeclaredInstances(
String16(aidlHalServiceDescriptor));
for (const auto &aidlInstance : aidlProviders) {
std::string aidlServiceName =
getFullAidlProviderName(std::string(String8(aidlInstance).c_str()));
auto res = sm->registerForNotifications(String16(aidlServiceName.c_str()), this);
if (res != OK) {
ALOGE("%s Unable to register for notifications with AIDL service manager",
__FUNCTION__);
return res;
}
addAidlProviderLocked(aidlServiceName);
}
return OK;
}