VTS-DEBUG VtsHalCameraProviderV2_4TargetTest CameraHidlTest.noHal1AfterP FAIL
Android Q vts 测试failed 项
09-02 09:58:06.205 ERROR <testsuites tests="1" failures="1" disabled="0" errors="0" timestamp="2020-09-02T01:58:06" time="0.008" name="AllTests">
09-02 09:58:06.205 ERROR <testsuite name="CameraHidlTest" tests="1" failures="1" disabled="0" errors="0" time="0.008">
09-02 09:58:06.205 ERROR <testcase name="noHal1AfterP" status="run" time="0.008" classname="CameraHidlTest">
09-02 09:58:06.205 ERROR <failure message="hardware/interfaces/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp:1570
Expected: (deviceVersion) != (CAMERA_DEVICE_API_VERSION_1_0), actual: 256 vs 256" type=""><![CDATA[hardware/interfaces/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp:1570
09-02 09:58:06.205 ERROR Expected: (deviceVersion) != (CAMERA_DEVICE_API_VERSION_1_0), actual: 256 vs 256]]></failure>
09-02 09:58:06.205 ERROR </testcase>
09-02 09:58:06.205 ERROR </testsuite>
09-02 09:58:06.205 ERROR </testsuites>
09-02 09:58:06.205 ERROR hardware/interfaces/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp:1570
Expected: (deviceVersion) != (CAMERA_DEVICE_API_VERSION_1_0), actual: 256 vs 256
09-02 09:58:06.205 ERROR [Test Case] 1/43 CameraHidlTest.noHal1AfterP(legacy/0)_64bit FAIL
测试的fail项是CameraHidlTest.noHal1AfterP ,看名字就知道是要android P 之后不能有Camera Hal1
查看报错的文件hardware/interfaces/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp
// Test devices with first_api_level >= P does not advertise device@1.0
TEST_F(CameraHidlTest, noHal1AfterP) {constexpr int32_t HAL1_PHASE_OUT_API_LEVEL = 28;int32_t firstApiLevel = 0;getFirstApiLevel(&firstApiLevel);// all devices with first API level == 28 and <= 1GB of RAM must set low_ram// and thus be allowed to continue using HAL1if ((firstApiLevel == HAL1_PHASE_OUT_API_LEVEL) &&(property_get_bool("ro.config.low_ram", /*default*/ false))) {ALOGI("Hal1 allowed for low ram device");return;}if (firstApiLevel >= HAL1_PHASE_OUT_API_LEVEL) {hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider);for (const auto& name : cameraDeviceNames) {int deviceVersion = getCameraDeviceVersion(name, mProviderType);ASSERT_NE(deviceVersion, 0); // Must be a valid device versionASSERT_NE(deviceVersion, CAMERA_DEVICE_API_VERSION_1_0); // Must not be device@1.0}}
}
deviceVersion Must not be device@1.0,
查看deviceVersion 生成逻辑,
int getCameraDeviceVersion(const hidl_string& deviceName,const hidl_string &providerType) {std::string version;bool match = matchDeviceName(deviceName, providerType, &version, nullptr);if (!match) {return -1;}if (version.compare(kHAL3_5) == 0) {return CAMERA_DEVICE_API_VERSION_3_5;} else if (version.compare(kHAL3_4) == 0) {return CAMERA_DEVICE_API_VERSION_3_4;} else if (version.compare(kHAL3_3) == 0) {return CAMERA_DEVICE_API_VERSION_3_3;} else if (version.compare(kHAL3_2) == 0) {return CAMERA_DEVICE_API_VERSION_3_2;} else if (version.compare(kHAL1_0) == 0) {return CAMERA_DEVICE_API_VERSION_1_0;}return 0;}
是从version判断的,version又是从deviceName来的,看log deviceName格式是3303:09-02 01:58:38.540 15587 15587 I camera_hidl_hal_test: Camera Id[0] is device@1.0/legacy/0
查看deviceName
hidl_vec<hidl_string> CameraHidlTest::getCameraDeviceNames(sp<ICameraProvider> provider) {std::vector<std::string> cameraDeviceNames;Return<void> ret;ret = provider->getCameraIdList([&](auto status, const auto& idList) {ALOGI("getCameraIdList returns status:%d", (int)status);for (size_t i = 0; i < idList.size(); i++) {ALOGI("Camera Id[%zu] is %s", i, idList[i].c_str());}ASSERT_EQ(Status::OK, status);for (const auto& id : idList) {cameraDeviceNames.push_back(id);}});if (!ret.isOk()) {ADD_FAILURE();}// External camera devices are reported through cameraDeviceStatusChangestruct ProviderCb : public ICameraProviderCallback {virtual Return<void> cameraDeviceStatusChange(const hidl_string& devName,CameraDeviceStatus newStatus) override {ALOGI("camera device status callback name %s, status %d",devName.c_str(), (int) newStatus);if (newStatus == CameraDeviceStatus::PRESENT) {externalCameraDeviceNames.push_back(devName);}return Void();}virtual Return<void> torchModeStatusChange(const hidl_string&, TorchModeStatus) override {return Void();}std::vector<std::string> externalCameraDeviceNames;};sp<ProviderCb> cb = new ProviderCb;auto status = mProvider->setCallback(cb);for (const auto& devName : cb->externalCameraDeviceNames) {if (cameraDeviceNames.end() == std::find(cameraDeviceNames.begin(), cameraDeviceNames.end(), devName)) {cameraDeviceNames.push_back(devName);}}hidl_vec<hidl_string> retList(cameraDeviceNames.size());for (size_t i = 0; i < cameraDeviceNames.size(); i++) {retList[i] = cameraDeviceNames[i];}return retList;
}
看provider->getCameraIdList 到hardware/interfaces/camera/provider/2.4/default/LegacyCameraProviderImpl_2_4.cpp
Return<void> LegacyCameraProviderImpl_2_4::getCameraIdList(ICameraProvider::getCameraIdList_cb _hidl_cb) {std::vector<hidl_string> deviceNameList;for (auto const& deviceNamePair : mCameraDeviceNames) {if (std::stoi(deviceNamePair.first) >= mNumberOfLegacyCameras) {// External camera devices must be reported through the device status change callback,// not in this list.continue;}if (mCameraStatusMap[deviceNamePair.first] == CAMERA_DEVICE_STATUS_PRESENT) {deviceNameList.push_back(deviceNamePair.second);}}hidl_vec<hidl_string> hidlDeviceNameList(deviceNameList);_hidl_cb(Status::OK, hidlDeviceNameList);return Void();
}
mCameraDeviceNames
void LegacyCameraProviderImpl_2_4::addDeviceNames(int camera_id, CameraDeviceStatus status, bool cam_new)
{char cameraId[kMaxCameraIdLen];snprintf(cameraId, sizeof(cameraId), "%d", camera_id);std::string cameraIdStr(cameraId);mCameraIds.add(cameraIdStr);// initialize mCameraDeviceNames and mOpenLegacySupportedmOpenLegacySupported[cameraIdStr] = false;int deviceVersion = mModule->getDeviceVersion(camera_id);auto deviceNamePair = std::make_pair(cameraIdStr,getHidlDeviceName(cameraIdStr, deviceVersion));mCameraDeviceNames.add(deviceNamePair);if (cam_new) {mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, status);}if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 &&mModule->isOpenLegacyDefined()) {// try open_legacy to see if it actually worksif ((property_get_bool("ro.config.low_ram", /*default*/ false))) {deviceNamePair = std::make_pair(cameraIdStr,getHidlDeviceName(cameraIdStr, CAMERA_DEVICE_API_VERSION_1_0));mCameraDeviceNames.add(deviceNamePair);if (cam_new) {mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, status);}} else {struct hw_device_t* halDev = nullptr;int ret = mModule->openLegacy(cameraId, CAMERA_DEVICE_API_VERSION_1_0, &halDev);if (ret == 0) {mOpenLegacySupported[cameraIdStr] = true;halDev->close(halDev);deviceNamePair = std::make_pair(cameraIdStr,getHidlDeviceName(cameraIdStr, CAMERA_DEVICE_API_VERSION_1_0));mCameraDeviceNames.add(deviceNamePair);if (cam_new) {mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, status);}} else if (ret == -EBUSY || ret == -EUSERS) {// Looks like this provider instance is not initialized during// system startup and there are other camera users already.// Not a good sign but not fatal.ALOGW("%s: open_legacy try failed!", __FUNCTION__);}}}
}
getHidlDeviceName devicename 的格式就是在这边定义的
std::string LegacyCameraProviderImpl_2_4::getHidlDeviceName(std::string cameraId, int deviceVersion) {// Maybe consider create a version check method and SortedVec to speed up?if (deviceVersion != CAMERA_DEVICE_API_VERSION_1_0 &&deviceVersion != CAMERA_DEVICE_API_VERSION_3_2 &&deviceVersion != CAMERA_DEVICE_API_VERSION_3_3 &&deviceVersion != CAMERA_DEVICE_API_VERSION_3_4 &&deviceVersion != CAMERA_DEVICE_API_VERSION_3_5 &&deviceVersion != CAMERA_DEVICE_API_VERSION_3_6) {return hidl_string("");}// Supported combinations:// CAMERA_DEVICE_API_VERSION_1_0 -> ICameraDevice@1.0// CAMERA_DEVICE_API_VERSION_3_[2-4] -> ICameraDevice@[3.2|3.3]// CAMERA_DEVICE_API_VERSION_3_5 + CAMERA_MODULE_API_VERSION_2_4 -> ICameraDevice@3.4// CAMERA_DEVICE_API_VERSION_3_[5-6] + CAMERA_MODULE_API_VERSION_2_5 -> ICameraDevice@3.5bool isV1 = deviceVersion == CAMERA_DEVICE_API_VERSION_1_0;int versionMajor = isV1 ? 1 : 3;int versionMinor = isV1 ? 0 : mPreferredHal3MinorVersion;if (deviceVersion == CAMERA_DEVICE_API_VERSION_3_5) {if (mModule->getModuleApiVersion() == CAMERA_MODULE_API_VERSION_2_5) {versionMinor = 5;} else {versionMinor = 4;}} else if (deviceVersion == CAMERA_DEVICE_API_VERSION_3_6) {versionMinor = 5;}char deviceName[kMaxCameraDeviceNameLen];snprintf(deviceName, sizeof(deviceName), "device@%d.%d/legacy/%s",versionMajor, versionMinor, cameraId.c_str());return deviceName;
}
在看上面addDeviceNames的逻辑 mModule->isOpenLegacyDefined() 有定义OpenLegacy的话 和 mModule->openLegacy 打开成功的话会使用CAMERA_DEVICE_API_VERSION_1_0
hardware/interfaces/camera/common/1.0/default/CameraModule.cpp
bool CameraModule::isOpenLegacyDefined() const {if (getModuleApiVersion() < CAMERA_MODULE_API_VERSION_2_3) {return false;}return mModule->open_legacy != NULL;
}int CameraModule::openLegacy(const char* id, uint32_t halVersion, struct hw_device_t** device) {int res;ATRACE_BEGIN("camera_module->open_legacy");res = mModule->open_legacy(&mModule->common, id, halVersion, device);ATRACE_END();return res;
}
查找open_legacy
在hardware/qcom/camera/QCamera2/QCamera2Hal.cpp 有这么个定义配置
// Camera dependencies
#include "QCamera2Factory.h"
#include "util/QCameraCommon.h"
#include "HAL3/QCamera3VendorTags.h"
#include "util/QCameraCommon.h"static hw_module_t camera_common = {.tag = HARDWARE_MODULE_TAG,.module_api_version = CAMERA_MODULE_API_VERSION_2_4,.hal_api_version = HARDWARE_HAL_API_VERSION,.id = CAMERA_HARDWARE_MODULE_ID,.name = "QCamera Module",.author = "Qualcomm Innovation Center Inc",.methods = &qcamera::QCamera2Factory::mModuleMethods,.dso = NULL,.reserved = {0}
};camera_module_t HAL_MODULE_INFO_SYM = {.common = camera_common,.get_number_of_cameras = qcamera::QCamera2Factory::get_number_of_cameras,.get_camera_info = qcamera::QCamera2Factory::get_camera_info,.set_callbacks = qcamera::QCamera2Factory::set_callbacks,.get_vendor_tag_ops = qcamera::QCamera3VendorTags::get_vendor_tag_ops,.open_legacy = (qcamera::QCameraCommon::needHAL1Support()) ?qcamera::QCamera2Factory::open_legacy : NULL,.set_torch_mode = qcamera::QCamera2Factory::set_torch_mode,.init = NULL,.reserved = {0}
};
needHAL1Support
hardware/qcom/camera/QCamera2/util/QCameraCommon.cpp
/*===========================================================================* FUNCTION : needHAL1Support** DESCRIPTION: Function to check whether HAL1 is supported or not.** PARAMETERS : None** RETURN : TRUE -- HAL1/HAL3 supported target.* FALSE -- Only HAL3 supported target.*==========================================================================*/
bool QCameraCommon::needHAL1Support()
{char prop[PROPERTY_VALUE_MAX];memset(prop, 0, PROPERTY_VALUE_MAX);property_get("persist.vendor.camera.hal1.enable",prop,"");if(0 < strlen(prop)){return (atoi(prop) == 1);}#ifdef SUPPORT_ONLY_HAL3LOGI("ONLY HAL3 SUPPORTED");return FALSE;
#else// HAL1/HAL3 is supportedLOGI("HAL1/HAL3 IS SUPPORTED");return TRUE;
#endif#ifndef HAS_LOW_RAM// QM215, QM2150 non-GO supports only HAL3if ((is_target_QM215() || is_target_QM2150())) {LOGI("ONLY HAL3 SUPPORTED");return FALSE;}
#else// HAL1/HAL3 is supportedLOGI("HAL1/HAL3 IS SUPPORTED");return TRUE;
#endif
}
到此就比较明了了,解决方法有以下几个可行
1.设置 prop persist.vendor.camera.hal1.enable = 0 关闭hal1
2.定义SUPPORT_ONLY_HAL3 仅允许使用hal3
3.修改QCamera2Hal.cpp 将 “.open_legacy = (qcamera::QCameraCommon::needHAL1Support()) ? qcamera::QCamera2Factory::open_legacy : NULL”, 直接赋值 NULL “.open_legacy = NULL”
其中 第二点SUPPORT_ONLY_HAL3 修改文件 hardware/qcom/camera/QCamera2/Android.mk
修改下满足条件即可
ifneq (,$(filter $(TRINKET) msm8937_32go-userdebug, $(TARGET_BOARD_PLATFORM)))
LOCAL_CFLAGS += -DSUPPORT_ONLY_HAL3
endif
VTS-DEBUG VtsHalCameraProviderV2_4TargetTest CameraHidlTest.noHal1AfterP FAIL相关推荐
- Android 10(Q)GMS(cts/vts/gts)认证总结
本文主要介绍android10的GMS认证相关的内容,包括新特性.新要求.特殊问题以及失败项等. 1)android10的新特性新要求 1.Project Mainline :谷歌将能够直接向终端用户 ...
- python任务调度框架_Python任务调度模块APScheduler
一.APScheduler 是什么&APScheduler四种组成部分? APScheduler全程为Advanced Python Scheduler,是一款轻量级的Python任务调度框架 ...
- 在webLogic 10.3中部署Hibernate 3.5出现 ClassNotFoundException解决办法
在开发Hibernate的Web项目应用时使用tomcat时运行很好,但实际生产环境中要部署到WebLogic就会出现一些ClassNotFoundException异常. org.hibernate ...
- 微信公众号开发之微信服务器配置
接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 通讯过程 第一步:填写服务器配置 登录微信公众平台官网后,在公众平台官 ...
- 科大讯飞 语音识别 VB WIN10 X64 VS2017
若使用C# ,请用CS转VBConverter 工具转换 Imports System.Runtime.InteropServices Imports System.IO #Const _Debug ...
- Unity3D网络游戏0.2
一.异步委托 C#委托 异步委托[理解] 异步委托[原理] 异步委托[实验] 注意:Action.BeginInvoke方法是在.NET Framework中引入的,而在.NET Core和.NET ...
- Unity3D网络游戏实战——实践出真知:大乱斗游戏
前言 这一章是教我们做一个大乱斗游戏.但是书中的代码有些前后不一致导致运行错误,如果你也碰到了这样的情况,可以参考我的代码 我们要完成的主要有以下这些事 左键操控角色行走 右键操控角色攻击 受到攻击掉 ...
- 实践出真知:大乱斗游戏
文章目录 第一版角色类Human BaseHuman CtrlHuman SyncHuman 通信协议 消息队列 NetManager类 加入网络功能 消息处理 第二版角色类 CtrlHuman Sy ...
- Android Camera(13)HEIF Imaging
HEIF Imaging 目录 HEIF Imaging 要求 实现 媒体 摄像头 验证 搭载 Android 10 的设备支持 HEIC 压缩图片格式,它是 ISO/IEC 23008-12 中规定 ...
最新文章
- platform平台工作原理
- python100行代码-100行Python代码自动抢火车票!
- 第三方登录(QQ登录)开发流程详解
- 52 两个链表的第一个公共结点(时间空间效率的平衡)
- 【WIN10】WIN2D——基本圖形的繪製
- 【KMP】重复子串(ybtoj KMP-2)
- 用Oracle归档日志进行恢复方法
- objective-c block 讲解
- python基础语法加爬虫精进_从Python安装到语法基础,这才是初学者都能懂的爬虫教程...
- r语言 求几个数的最小公倍数_【微课】北师大版五年级数学上册第五单元8找最小公倍数...
- 如何判断一个进程已经完成初始化?
- EscapeDataString URI 字符串太长
- CSND如何转载别人的文章
- 行动是最好的告白,钟意社科院杜兰金融管理硕士项目的你不要错过机会
- 利用fiddler和低版本的iTunes实现iOS抓包
- 魂武者服务器维护,《魂武者》8月16日停机更新公告
- git拉取远程指定分支到本地
- STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片
- rxjs 经典使用场景
- 在windows应用商店安装ubuntu子系统错误总结