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相关推荐

  1. Android 10(Q)GMS(cts/vts/gts)认证总结

    本文主要介绍android10的GMS认证相关的内容,包括新特性.新要求.特殊问题以及失败项等. 1)android10的新特性新要求 1.Project Mainline :谷歌将能够直接向终端用户 ...

  2. python任务调度框架_Python任务调度模块APScheduler

    一.APScheduler 是什么&APScheduler四种组成部分? APScheduler全程为Advanced Python Scheduler,是一款轻量级的Python任务调度框架 ...

  3. 在webLogic 10.3中部署Hibernate 3.5出现 ClassNotFoundException解决办法

    在开发Hibernate的Web项目应用时使用tomcat时运行很好,但实际生产环境中要部署到WebLogic就会出现一些ClassNotFoundException异常. org.hibernate ...

  4. 微信公众号开发之微信服务器配置

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 通讯过程 第一步:填写服务器配置 登录微信公众平台官网后,在公众平台官 ...

  5. 科大讯飞 语音识别 VB WIN10 X64 VS2017

    若使用C# ,请用CS转VBConverter 工具转换 Imports System.Runtime.InteropServices Imports System.IO #Const _Debug ...

  6. Unity3D网络游戏0.2

    一.异步委托 C#委托 异步委托[理解] 异步委托[原理] 异步委托[实验] 注意:Action.BeginInvoke方法是在.NET Framework中引入的,而在.NET Core和.NET ...

  7. Unity3D网络游戏实战——实践出真知:大乱斗游戏

    前言 这一章是教我们做一个大乱斗游戏.但是书中的代码有些前后不一致导致运行错误,如果你也碰到了这样的情况,可以参考我的代码 我们要完成的主要有以下这些事 左键操控角色行走 右键操控角色攻击 受到攻击掉 ...

  8. 实践出真知:大乱斗游戏

    文章目录 第一版角色类Human BaseHuman CtrlHuman SyncHuman 通信协议 消息队列 NetManager类 加入网络功能 消息处理 第二版角色类 CtrlHuman Sy ...

  9. Android Camera(13)HEIF Imaging

    HEIF Imaging 目录 HEIF Imaging 要求 实现 媒体 摄像头 验证 搭载 Android 10 的设备支持 HEIC 压缩图片格式,它是 ISO/IEC 23008-12 中规定 ...

最新文章

  1. platform平台工作原理
  2. python100行代码-100行Python代码自动抢火车票!
  3. 第三方登录(QQ登录)开发流程详解
  4. 52 两个链表的第一个公共结点(时间空间效率的平衡)
  5. 【WIN10】WIN2D——基本圖形的繪製
  6. 【KMP】重复子串(ybtoj KMP-2)
  7. 用Oracle归档日志进行恢复方法
  8. objective-c block 讲解
  9. python基础语法加爬虫精进_从Python安装到语法基础,这才是初学者都能懂的爬虫教程...
  10. r语言 求几个数的最小公倍数_【微课】北师大版五年级数学上册第五单元8找最小公倍数...
  11. 如何判断一个进程已经完成初始化?
  12. EscapeDataString URI 字符串太长
  13. CSND如何转载别人的文章
  14. 行动是最好的告白,钟意社科院杜兰金融管理硕士项目的你不要错过机会
  15. 利用fiddler和低版本的iTunes实现iOS抓包
  16. 魂武者服务器维护,《魂武者》8月16日停机更新公告
  17. git拉取远程指定分支到本地
  18. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片
  19. rxjs 经典使用场景
  20. 在windows应用商店安装ubuntu子系统错误总结

热门文章

  1. 从键盘输入一个字符串并输出
  2. C++输入日期判断是周几
  3. Java UT用例实践记录
  4. IOS打开Micosoft文档
  5. python将图片转矩阵
  6. 如何确定Kmeans中的k值
  7. mysql 本周函数_MySQL week()函数
  8. HTML设置文字和图片居中
  9. 在Java中 什么叫包-包有什么用途-如何创建包-
  10. Java面经:小米暑期实习+秋招真题分享