From 162e6e560a3fdf6b472e2b7ad4ec3cac5303b0f5 Mon Sep 17 00:00:00 2001 From: z30034863 Date: Sat, 30 Aug 2025 19:55:20 +0800 Subject: [PATCH] fix dts 0828 Signed-off-by: z30034863 --- adapter/ohos/HapVerify.java | 178 ++++++++------ .../include/json/hap_verify_utils.h | 7 +- .../frameworks/src/json/hap_verify_utils.cpp | 226 +++++++++++------- .../hap_verify_utils_test.cpp | 47 ---- 4 files changed, 253 insertions(+), 205 deletions(-) diff --git a/adapter/ohos/HapVerify.java b/adapter/ohos/HapVerify.java index 090565ef..a10b8dd2 100644 --- a/adapter/ohos/HapVerify.java +++ b/adapter/ohos/HapVerify.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.Objects; +import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -272,47 +273,22 @@ class HapVerify { * @return true if app fields is same */ private static boolean checkAppFieldsIsSame(List hapVerifyInfos) { - if (hapVerifyInfos.isEmpty()) { - String cause = "Hap verify infos is empty."; - LOG.error(PackingToolErrMsg.CHECK_HAP_VERIFY_INFO_LIST_EMPTY.toString(cause)); + if (hapVerifyInfos == null || hapVerifyInfos.isEmpty()) { + LOG.error(PackingToolErrMsg.CHECK_HAP_VERIFY_INFO_LIST_EMPTY.toString("Hap verify infos is empty.")); return false; } - HapVerifyInfo verifyInfo = hapVerifyInfos.get(0); - Optional optional = hapVerifyInfos.stream() - .filter(hapVerifyInfo -> !hapVerifyInfo.getModuleType().equals(TYPE_SHARED)) - .findFirst(); - if (optional.isPresent()) { - verifyInfo = optional.get(); - } + HapVerifyInfo baseInfo = hapVerifyInfos.stream().filter(h -> !TYPE_SHARED.equals(h.getModuleType())) + .findFirst().orElse(hapVerifyInfos.get(0)); + VerifyCollection verifyCollection = getVerifyCollection(baseInfo); + HapVerifyInfo entryInfo = hapVerifyInfos.stream() + .filter(hapInfo -> ENTRY.equals(hapInfo.getModuleType())).findFirst().orElse(baseInfo); + String moduleName = entryInfo.getModuleName(); + List assetAccessGroups = entryInfo.getAssetAccessGroups(); List hapList = new ArrayList<>(); List hspList = new ArrayList<>(); - int hspMinCompatibleVersionCodeMax = -1; - int hspTargetApiVersionMax = -1; - int hspMinApiVersionMax = -1; - VerifyCollection verifyCollection = new VerifyCollection(); - verifyCollection.bundleName = verifyInfo.getBundleName(); - verifyCollection.setBundleType(verifyInfo.getBundleType()); - verifyCollection.vendor = verifyInfo.getVendor(); - verifyCollection.versionCode = verifyInfo.getVersion().versionCode; - verifyCollection.versionName = verifyInfo.getVersion().versionName; - verifyCollection.compatibleApiVersion = verifyInfo.getApiVersion().getCompatibleApiVersion(); - verifyCollection.releaseType = verifyInfo.getApiVersion().getReleaseType(); - verifyCollection.targetBundleName = verifyInfo.getTargetBundleName(); - verifyCollection.targetPriority = verifyInfo.getTargetPriority(); - verifyCollection.debug = verifyInfo.isDebug(); - verifyCollection.setModuleName(verifyInfo.getModuleName()); - verifyCollection.setModuleType(verifyInfo.getModuleType()); - verifyCollection.setMultiAppMode(verifyInfo.getMultiAppMode()); - - List assetAccessGroups = verifyInfo.getAssetAccessGroups(); - String moduleName = verifyInfo.getModuleName(); - Optional entryOptional = hapVerifyInfos.stream() - .filter(hapVerifyInfo -> ENTRY.equals(hapVerifyInfo.getModuleType())) - .findFirst(); - if (entryOptional.isPresent()) { - moduleName = entryOptional.get().getModuleName(); - assetAccessGroups = entryOptional.get().getAssetAccessGroups(); - } + HapVerifyInfo minCompatibleVersionCodeMaxInfo = new HapVerifyInfo(); + HapVerifyInfo targetApiVersionMaxInfo = new HapVerifyInfo(); + HapVerifyInfo minApiVersionMaxInfo = new HapVerifyInfo(); for (HapVerifyInfo hapVerifyInfo : hapVerifyInfos) { if (!appFieldsIsSame(verifyCollection, hapVerifyInfo)) { LOG.warning("Module: (" + verifyCollection.getModuleName() + ") and Module: (" + @@ -327,52 +303,101 @@ class HapVerify { hapList.add(hapVerifyInfo); } else if (Objects.equals(hapVerifyInfo.getFileType(), HSP_SUFFIX)) { hspList.add(hapVerifyInfo); - if (hapVerifyInfo.getVersion().minCompatibleVersionCode > hspMinCompatibleVersionCodeMax) { - hspMinCompatibleVersionCodeMax = hapVerifyInfo.getVersion().minCompatibleVersionCode; + if (hapVerifyInfo.getVersion().minCompatibleVersionCode > + minCompatibleVersionCodeMaxInfo.getVersion().minCompatibleVersionCode) { + minCompatibleVersionCodeMaxInfo = hapVerifyInfo; } - if (hapVerifyInfo.getApiVersion().getTargetApiVersion() > hspTargetApiVersionMax) { - hspTargetApiVersionMax = hapVerifyInfo.getApiVersion().getTargetApiVersion(); + if (hapVerifyInfo.getApiVersion().getTargetApiVersion() > + targetApiVersionMaxInfo.getApiVersion().getTargetApiVersion()) { + targetApiVersionMaxInfo = hapVerifyInfo; } - if (hapVerifyInfo.getApiVersion().getCompatibleApiVersion() > hspMinApiVersionMax) { - hspMinApiVersionMax = hapVerifyInfo.getApiVersion().getCompatibleApiVersion(); + if (hapVerifyInfo.getApiVersion().getCompatibleApiVersion() > + minApiVersionMaxInfo.getApiVersion().getCompatibleApiVersion()) { + minApiVersionMaxInfo = hapVerifyInfo; } } } - if (!appFieldsIsValid(hapList, hspMinCompatibleVersionCodeMax, hspTargetApiVersionMax, hspMinApiVersionMax)) { - return false; - } - if (!moduleDebugValidation(hapList, hspList)) { - return false; - } - return true; + return appFieldsIsValid(hapList, minCompatibleVersionCodeMaxInfo, targetApiVersionMaxInfo, minApiVersionMaxInfo) + && moduleDebugValidation(hapList, hspList); + } + + private static VerifyCollection getVerifyCollection(HapVerifyInfo baseInfo) { + VerifyCollection verifyCollection = new VerifyCollection(); + verifyCollection.bundleName = baseInfo.getBundleName(); + verifyCollection.setBundleType(baseInfo.getBundleType()); + verifyCollection.vendor = baseInfo.getVendor(); + verifyCollection.versionCode = baseInfo.getVersion().versionCode; + verifyCollection.versionName = baseInfo.getVersion().versionName; + verifyCollection.compatibleApiVersion = baseInfo.getApiVersion().getCompatibleApiVersion(); + verifyCollection.releaseType = baseInfo.getApiVersion().getReleaseType(); + verifyCollection.targetBundleName = baseInfo.getTargetBundleName(); + verifyCollection.targetPriority = baseInfo.getTargetPriority(); + verifyCollection.debug = baseInfo.isDebug(); + verifyCollection.setModuleName(baseInfo.getModuleName()); + verifyCollection.setModuleType(baseInfo.getModuleType()); + verifyCollection.setMultiAppMode(baseInfo.getMultiAppMode()); + return verifyCollection; } - private static boolean appFieldsIsValid(List hapVerifyInfos, int minCompatibleVersionCode, - int targetApiVersion, int minApiVersion) { - if (hapVerifyInfos.isEmpty()) { + private static boolean appFieldsIsValid(List hapVerifyInfos, + HapVerifyInfo minCompatibleVersionCodeMaxInfo, + HapVerifyInfo targetApiVersionMaxInfo, + HapVerifyInfo minApiVersionMaxInfo) { + if (hapVerifyInfos == null || hapVerifyInfos.isEmpty()) { LOG.warning("Hap verify infos is empty"); return true; } - HapVerifyInfo hap = hapVerifyInfos.get(0); + HapVerifyInfo baseHap = hapVerifyInfos.get(0); + int baseMinCompatibleVersionCode = baseHap.getVersion().minCompatibleVersionCode; + int baseTargetApiVersion = baseHap.getApiVersion().getTargetApiVersion(); + int baseCompatibleApiVersion = baseHap.getApiVersion().getCompatibleApiVersion(); + + // 校验所有 HAP 是否一致 for (HapVerifyInfo hapInfo : hapVerifyInfos) { - if (hap.getVersion().minCompatibleVersionCode != hapInfo.getVersion().minCompatibleVersionCode || - hap.getApiVersion().getTargetApiVersion() != hapInfo.getApiVersion().getTargetApiVersion() || - hap.getApiVersion().getCompatibleApiVersion() != hapInfo.getApiVersion().getCompatibleApiVersion()) { - String errMsg = "Hap minCompatibleVersionCode or targetApiVersion or minApiVersion different."; - String solution = "Ensure that the values of 'minCompatibleVersionCode' and 'targetApiVersion' " + - "and 'minApiVersion' in the module.json file of each HAP module are the same."; - LOG.error(PackingToolErrMsg.CHECK_APP_FIELDS_INVALID.toString(errMsg, solution)); + if (baseMinCompatibleVersionCode != hapInfo.getVersion().minCompatibleVersionCode) { + LOG.error(PackingToolErrMsg.CHECK_APP_FIELDS_INVALID.toString( + String.format("The minCompatibleVersionCode attribute values of two Hap are different. " + + "Hap[%s]: (minCompatibleVersionCode: %d); Hap[%s]: (minCompatibleVersionCode: %d).", + baseHap.getModuleName(), baseMinCompatibleVersionCode, hapInfo.getModuleName(), + hapInfo.getVersion().minCompatibleVersionCode), + "Ensure values of minCompatibleVersionCode are same in each HAP." )); + return false; + } + if (baseTargetApiVersion != hapInfo.getApiVersion().getTargetApiVersion()) { + LOG.error(PackingToolErrMsg.CHECK_APP_FIELDS_INVALID.toString( + String.format("The targetApiVersion attribute values of two Hap are different. " + + "Hap[%s]: (targetApiVersion: %d); Hap[%s]: (targetApiVersion: %d).", + baseHap.getModuleName(), baseTargetApiVersion, + hapInfo.getModuleName(), hapInfo.getApiVersion().getTargetApiVersion()), + "Ensure values of targetApiVersion are same in each HAP." )); + return false; + } + if (baseCompatibleApiVersion != hapInfo.getApiVersion().getCompatibleApiVersion()) { + LOG.error(PackingToolErrMsg.CHECK_APP_FIELDS_INVALID.toString( + String.format("The minApiVersion attribute values of two Hap are different. " + + "Hap[%s]: (minApiVersion: %d); Hap[%s]: (minApiVersion: %d).", + baseHap.getModuleName(), baseCompatibleApiVersion, + hapInfo.getModuleName(), hapInfo.getApiVersion().getCompatibleApiVersion()), + "Ensure values of minApiVersion are same in each HAP." )); return false; } } - if (hap.getVersion().minCompatibleVersionCode < minCompatibleVersionCode || - hap.getApiVersion().getTargetApiVersion() < targetApiVersion || - hap.getApiVersion().getCompatibleApiVersion() < minApiVersion) { - String cause = "The values of minCompatibleVersionCode or targetApiVersion or minApiVersion in the" + - " module.json file of the HAP module are smaller than those of the HSP module."; - String solution = "Ensure that the values of aminCompatibleVersionCode and targetApiVersion" + - " and minApiVersion in the module.json file of the HAP module" + - " are greater than or equal to those of the HSP module."; + + // 封装公共检查逻辑:HAP >= HSP + return checkField("minCompatibleVersionCode", baseMinCompatibleVersionCode, baseHap, + minCompatibleVersionCodeMaxInfo.getVersion().minCompatibleVersionCode, minCompatibleVersionCodeMaxInfo) + && checkField("targetApiVersion", baseTargetApiVersion, baseHap, + targetApiVersionMaxInfo.getApiVersion().getTargetApiVersion(), targetApiVersionMaxInfo) + && checkField("minApiVersion", baseCompatibleApiVersion, baseHap, + minApiVersionMaxInfo.getApiVersion().getCompatibleApiVersion(), minApiVersionMaxInfo); + } + + private static boolean checkField(String field, int hapVal, HapVerifyInfo hap, + int hspVal, HapVerifyInfo hsp) { + if (hapVal < hspVal) { + String cause = String.format("The values of %s[%d] in HAP[%s] < %s[%d] of HSP[%s].", + field, hapVal, hap.getModuleName(), field, hspVal, hsp.getModuleName()); + String solution = String.format("Ensure that the values of %s in HAP >= HSP.", field); LOG.error(PackingToolErrMsg.CHECK_APP_FIELDS_INVALID.toString(cause, solution)); return false; } @@ -382,13 +407,14 @@ class HapVerify { private static boolean moduleDebugValidation(List hapVerifyInfos, List hspVerifyInfos) { if (hapVerifyInfos.isEmpty()) { - LOG.warning("Hap verify infos is empty"); + LOG.warning("Hap verify infos is empty."); return true; } HapVerifyInfo hap = hapVerifyInfos.get(0); for (HapVerifyInfo hapInfo : hapVerifyInfos) { if (hap.isDebug() != hapInfo.isDebug()) { - String errMsg = "The debug fields of multiple Hap are different."; + String errMsg = String.format("The debug fields of Hap[%s] and Hap[%s] are different.", + hap.getModuleName(), hapInfo.getModuleName()); String solution = "Ensure that the values of 'debug' in the module.json file of each HAP module" + " are the same."; LOG.error(PackingToolErrMsg.CHECK_APP_FIELDS_INVALID.toString(errMsg, solution)); @@ -396,11 +422,17 @@ class HapVerify { } } if (hap.isDebug() || hspVerifyInfos.isEmpty()) { - LOG.warning("Hap debug is true or Hsp verify infos is empty"); + LOG.info("Hap debug is true or Hsp verify infos is empty"); return true; } + List hspInfosNames = hspVerifyInfos.stream() + .filter(HapVerifyInfo::isDebug) + .map(HapVerifyInfo::getModuleName) + .collect(Collectors.toList()); + String hspNames = hspInfosNames.stream() + .collect(Collectors.joining(", ", "[", "]")); if (hspVerifyInfos.stream().anyMatch(HapVerifyInfo::isDebug)) { - String errMsg = "Detected HAP(s) with debug=false, but some HSP(s) are debug=true."; + String errMsg = "Detected HAP(s) with debug=false, but some HSP" + hspNames + " are debug=true."; String solution = "When the debug value of Hap is false,the debug value of Hsp should also be false."; LOG.error(PackingToolErrMsg.CHECK_APP_FIELDS_INVALID.toString(errMsg, solution)); return false; diff --git a/packing_tool/frameworks/include/json/hap_verify_utils.h b/packing_tool/frameworks/include/json/hap_verify_utils.h index be1794d7..cd922933 100644 --- a/packing_tool/frameworks/include/json/hap_verify_utils.h +++ b/packing_tool/frameworks/include/json/hap_verify_utils.h @@ -73,6 +73,7 @@ public: private: static bool CheckAppFieldsIsSame(const std::list& hapVerifyInfos); + static VerifyCollection GetVerifyCollection(const HapVerifyInfo& baseInfo); static bool CheckIsPluginApp(const std::list& hapVerifyInfos); static bool AppFieldsIsSame(const VerifyCollection& verifyCollection, const HapVerifyInfo& hapVerifyInfo); static bool IsEntryOrFeature(const std::string& moduleType); @@ -138,7 +139,11 @@ private: static bool CheckContinueTypeIsValid(const HapVerifyInfo& hapVerifyInfo1, const HapVerifyInfo& hapVerifyInfo2); static bool ModuleDebugValidation(const std::list hapList, const std::list hspList); static bool AppFieldsIsValid(const std::list& hapVerifyInfos, - int32_t minCompatibleVersionCode, int32_t targetApiVersion, int32_t minApiVersion); + const HapVerifyInfo& minCompatibleVersionCodeMaxInfo, + const HapVerifyInfo& targetApiVersionMaxInfo, + const HapVerifyInfo& minApiVersionMaxInfo); + static bool CheckField(const std::string& field, int32_t hapVal, const HapVerifyInfo& hap, + int32_t hspVal, const HapVerifyInfo& hsp); static bool AppAssetAccessGroupsIsSame(const std::list& assetAccessGroups, const HapVerifyInfo& hapVerifyInfo); }; diff --git a/packing_tool/frameworks/src/json/hap_verify_utils.cpp b/packing_tool/frameworks/src/json/hap_verify_utils.cpp index 051079f3..aeb90f6e 100644 --- a/packing_tool/frameworks/src/json/hap_verify_utils.cpp +++ b/packing_tool/frameworks/src/json/hap_verify_utils.cpp @@ -125,125 +125,183 @@ bool HapVerifyUtils::CheckIsPluginApp(const std::list& hapVerifyI bool HapVerifyUtils::CheckAppFieldsIsSame(const std::list& hapVerifyInfos) { if (hapVerifyInfos.empty()) { - LOGE("hapVerifyInfos is empty!"); + LOGE("Hap verify infos is empty."); return false; } + auto itBase = std::find_if(hapVerifyInfos.begin(), hapVerifyInfos.end(), + [](const HapVerifyInfo& h) { + return h.GetModuleType() != TYPE_SHARED; + }); + HapVerifyInfo baseInfo = (itBase != hapVerifyInfos.end()) ? *itBase : *hapVerifyInfos.begin(); + VerifyCollection verifyCollection = GetVerifyCollection(baseInfo); + auto itEntry = std::find_if(hapVerifyInfos.begin(), hapVerifyInfos.end(), + [](const HapVerifyInfo& h) { + return h.GetModuleType() == ENTRY; + }); + HapVerifyInfo entryInfo = (itEntry != hapVerifyInfos.end()) ? *itEntry : baseInfo; + std::string moduleName = entryInfo.GetModuleName(); + std::list assetAccessGroups = entryInfo.GetAssetAccessGroups(); std::list hapList; std::list hspList; - int32_t hspMinCompatibleVersionCodeMax = -1; - int32_t hspTargetApiVersionMax = -1; - int32_t hspMinApiVersionMax = -1; - HapVerifyInfo hapVerifyInfo = *hapVerifyInfos.begin(); - VerifyCollection verifyCollection; - verifyCollection.bundleName = hapVerifyInfo.GetBundleName(); - verifyCollection.bundleType = hapVerifyInfo.GetBundleType(); - verifyCollection.vendor = hapVerifyInfo.GetVendor(); - verifyCollection.versionCode = hapVerifyInfo.GetVersion().versionCode; - verifyCollection.versionName = hapVerifyInfo.GetVersion().versionName; - verifyCollection.compatibleApiVersion = hapVerifyInfo.GetApiVersion().compatibleApiVersion; - verifyCollection.releaseType = hapVerifyInfo.GetApiVersion().releaseType; - verifyCollection.targetBundleName = hapVerifyInfo.GetTargetBundleName(); - verifyCollection.targetPriority = hapVerifyInfo.GetTargetPriority(); - verifyCollection.debug = hapVerifyInfo.IsDebug(); - verifyCollection.moduleName = hapVerifyInfo.GetModuleName(); - verifyCollection.moduleType = hapVerifyInfo.GetModuleType(); - verifyCollection.multiAppMode = hapVerifyInfo.GetMultiAppMode(); - std::list assetAccessGroups = hapVerifyInfo.GetAssetAccessGroups(); - std::string moduleName = hapVerifyInfo.GetModuleName(); - auto it = std::find_if(hapVerifyInfos.begin(), hapVerifyInfos.end(), - [](const HapVerifyInfo& hapVerifyInfo) { - return hapVerifyInfo.GetModuleType() == ENTRY; - }); - std::optional entryOptional; - if (it != hapVerifyInfos.end()) { - entryOptional.emplace(*it); - if (entryOptional.has_value()) { - moduleName = entryOptional.value().GetModuleName(); - assetAccessGroups = entryOptional.value().GetAssetAccessGroups(); - } - } - for (HapVerifyInfo hapVerifyInfo : hapVerifyInfos) { - if (!AppFieldsIsSame(verifyCollection, hapVerifyInfo)) { + HapVerifyInfo minCompatibleVersionCodeMaxInfo; + HapVerifyInfo targetApiVersionMaxInfo; + HapVerifyInfo minApiVersionMaxInfo; + for (const auto& hap : hapVerifyInfos) { + if (!AppFieldsIsSame(verifyCollection, hap)) { LOGW("Module: (%s) and Module: (%s) has different values.", - verifyCollection.moduleName.c_str(), hapVerifyInfo.GetModuleName().c_str()); + verifyCollection.moduleName.c_str(), hap.GetModuleName().c_str()); return false; } - if (!AppAssetAccessGroupsIsSame(assetAccessGroups, hapVerifyInfo)) { + if (!AppAssetAccessGroupsIsSame(assetAccessGroups, hap)) { LOGW("Module: (%s) and Module: (%s) has different values.", - moduleName.c_str(), hapVerifyInfo.GetModuleName().c_str()); - } - if (hapVerifyInfo.GetFileType() == HAP_SUFFIX) { - hapList.emplace_back(hapVerifyInfo); - } else if (hapVerifyInfo.GetFileType() == HSP_SUFFIX) { - hspList.emplace_back(hapVerifyInfo); - if (hapVerifyInfo.GetVersion().minCompatibleVersionCode > hspMinCompatibleVersionCodeMax) { - hspMinCompatibleVersionCodeMax = hapVerifyInfo.GetVersion().minCompatibleVersionCode; + moduleName.c_str(), hap.GetModuleName().c_str()); + } + if (hap.GetFileType() == HAP_SUFFIX) { + hapList.emplace_back(hap); + } else if (hap.GetFileType() == HSP_SUFFIX) { + hspList.emplace_back(hap); + if (hap.GetVersion().minCompatibleVersionCode > + minCompatibleVersionCodeMaxInfo.GetVersion().minCompatibleVersionCode) { + minCompatibleVersionCodeMaxInfo = hap; } - if (hapVerifyInfo.GetApiVersion().targetApiVersion > hspTargetApiVersionMax) { - hspTargetApiVersionMax = hapVerifyInfo.GetApiVersion().targetApiVersion; + if (hap.GetApiVersion().targetApiVersion > targetApiVersionMaxInfo.GetApiVersion().targetApiVersion) { + targetApiVersionMaxInfo = hap; } - if (hapVerifyInfo.GetApiVersion().compatibleApiVersion > hspMinApiVersionMax) { - hspMinApiVersionMax = hapVerifyInfo.GetApiVersion().compatibleApiVersion; + if (hap.GetApiVersion().compatibleApiVersion > minApiVersionMaxInfo.GetApiVersion().compatibleApiVersion) { + minApiVersionMaxInfo = hap; } } } - if (!AppFieldsIsValid(hapList, hspMinCompatibleVersionCodeMax, hspTargetApiVersionMax, hspMinApiVersionMax)) { - return false; - } - if (!ModuleDebugValidation(hapList, hspList)) { - return false; - } - return true; + + return AppFieldsIsValid(hapList, minCompatibleVersionCodeMaxInfo, + targetApiVersionMaxInfo, minApiVersionMaxInfo) && + ModuleDebugValidation(hapList, hspList); } -bool HapVerifyUtils::ModuleDebugValidation(const std::list hapList, - const std::list hspList) +VerifyCollection HapVerifyUtils::GetVerifyCollection(const HapVerifyInfo& baseInfo) { - if (hapList.empty()) { - LOGW("hapList empty"); + VerifyCollection verifyCollection; + verifyCollection.bundleName = baseInfo.GetBundleName(); + verifyCollection.bundleType = baseInfo.GetBundleType(); + verifyCollection.vendor = baseInfo.GetVendor(); + verifyCollection.versionCode = baseInfo.GetVersion().versionCode; + verifyCollection.versionName = baseInfo.GetVersion().versionName; + verifyCollection.compatibleApiVersion = baseInfo.GetApiVersion().compatibleApiVersion; + verifyCollection.releaseType = baseInfo.GetApiVersion().releaseType; + verifyCollection.targetBundleName = baseInfo.GetTargetBundleName(); + verifyCollection.targetPriority = baseInfo.GetTargetPriority(); + verifyCollection.debug = baseInfo.IsDebug(); + verifyCollection.moduleName = baseInfo.GetModuleName(); + verifyCollection.moduleType = baseInfo.GetModuleType(); + verifyCollection.multiAppMode = baseInfo.GetMultiAppMode(); + return verifyCollection; +} + +bool HapVerifyUtils::AppFieldsIsValid(const std::list& hapVerifyInfos, + const HapVerifyInfo& minCompatibleVersionCodeMaxInfo, + const HapVerifyInfo& targetApiVersionMaxInfo, + const HapVerifyInfo& minApiVersionMaxInfo) +{ + if (hapVerifyInfos.empty()) { + LOGW("Hap verify infos is empty"); return true; } - HapVerifyInfo hap = *hapList.begin(); - for (const HapVerifyInfo& hapInfo : hapList) { - if (hap.IsDebug() != hapInfo.IsDebug()) { - LOGE("The debug fields of multiple Hap are different."); + const HapVerifyInfo& baseHap = *hapVerifyInfos.begin(); + int32_t baseMinCompatibleVersionCode = baseHap.GetVersion().minCompatibleVersionCode; + int32_t baseTargetApiVersion = baseHap.GetApiVersion().targetApiVersion; + int32_t baseCompatibleApiVersion = baseHap.GetApiVersion().compatibleApiVersion; + for (const auto& hap : hapVerifyInfos) { + if (baseMinCompatibleVersionCode != hap.GetVersion().minCompatibleVersionCode) { + LOGE("The minCompatibleVersionCode attribute values of two Hap are different. " + "Hap[%s]: (minCompatibleVersionCode: %d); Hap[%s]: (minCompatibleVersionCode: %d). " + "Solution: Ensure values of minCompatibleVersionCode are same in each HAP.", + baseHap.GetModuleName().c_str(), baseMinCompatibleVersionCode, hap.GetModuleName().c_str(), + hap.GetVersion().minCompatibleVersionCode); return false; } - } - if (hap.IsDebug() || hspList.empty()) { - LOGW("hap debug is true or hspList empty"); - return true; - } - for (const HapVerifyInfo& hapInfo : hspList) { - if (hapInfo.IsDebug()) { - LOGE("Detected HAP(s) with debug=false, but some HSP(s) are debug=true."); + if (baseTargetApiVersion != hap.GetApiVersion().targetApiVersion) { + LOGE("The targetApiVersion attribute values of two Hap are different. " + "Hap[%s]: (targetApiVersion: %d); Hap[%s]: (targetApiVersion: %d). " + "Solution: Ensure values of targetApiVersion are same in each HAP.", + baseHap.GetModuleName().c_str(), baseTargetApiVersion, hap.GetModuleName().c_str(), + hap.GetApiVersion().targetApiVersion); + return false; + } + if (baseCompatibleApiVersion != hap.GetApiVersion().compatibleApiVersion) { + LOGE("The minApiVersion attribute values of two Hap are different. " + "Hap[%s]: (minApiVersion: %d); Hap[%s]: (minApiVersion: %d). " + "Solution: Ensure values of minApiVersion are same in each HAP.", + baseHap.GetModuleName().c_str(), baseCompatibleApiVersion, hap.GetModuleName().c_str(), + hap.GetApiVersion().compatibleApiVersion); return false; } } + return CheckField("minCompatibleVersionCode", baseMinCompatibleVersionCode, baseHap, + minCompatibleVersionCodeMaxInfo.GetVersion().minCompatibleVersionCode, + minCompatibleVersionCodeMaxInfo) && + CheckField("targetApiVersion", baseTargetApiVersion, baseHap, + targetApiVersionMaxInfo.GetApiVersion().targetApiVersion, + targetApiVersionMaxInfo) && + CheckField("minApiVersion", baseCompatibleApiVersion, baseHap, + minApiVersionMaxInfo.GetApiVersion().compatibleApiVersion, + minApiVersionMaxInfo); +} + +bool HapVerifyUtils::CheckField(const std::string& field, int32_t hapVal, const HapVerifyInfo& hap, + int32_t hspVal, const HapVerifyInfo& hsp) +{ + if (hapVal < hspVal) { + LOGE("The values of %s[%d] in HAP[%s] < %s[%d] in HSP[%s]. " + "Solution: Ensure that the values of %s in HAP >= HSP.", + field.c_str(), hapVal, hap.GetModuleName().c_str(), + field.c_str(), hspVal, hsp.GetModuleName().c_str(), + field.c_str()); + return false; + } return true; } -bool HapVerifyUtils::AppFieldsIsValid(const std::list& hapVerifyInfos, - int32_t minCompatibleVersionCode, int32_t targetApiVersion, int32_t minApiVersion) +bool HapVerifyUtils::ModuleDebugValidation(const std::list hapVerifyInfos, + const std::list hspVerifyInfos) { if (hapVerifyInfos.empty()) { - LOGW("hapList empty"); + LOGW("Hap verify infos is empty."); return true; } HapVerifyInfo hap = *hapVerifyInfos.begin(); for (const HapVerifyInfo& hapInfo : hapVerifyInfos) { - if (hap.GetVersion().minCompatibleVersionCode != hapInfo.GetVersion().minCompatibleVersionCode || - hap.GetApiVersion().targetApiVersion != hapInfo.GetApiVersion().targetApiVersion || - hap.GetApiVersion().compatibleApiVersion != hapInfo.GetApiVersion().compatibleApiVersion) { - LOGE("hap minCompatibleVersionCode or targetApiVersion or minApiVersion different"); + if (hap.IsDebug() != hapInfo.IsDebug()) { + LOGE("The debug fields of Hap[%s] and Hap[%s] are different. " + "Solution: Ensure values of debug are same in each HAP.", + hap.GetModuleName().c_str(), + hapInfo.GetModuleName().c_str()); return false; } } - if (hap.GetVersion().minCompatibleVersionCode < minCompatibleVersionCode || - hap.GetApiVersion().targetApiVersion < targetApiVersion || - hap.GetApiVersion().compatibleApiVersion < minApiVersion) { - LOGE("minCompatibleVersionCode or targetApiVersion or minApiVersion property hap less than hsp"); - return false; + if (hap.IsDebug() || hspVerifyInfos.empty()) { + LOGI("Hap debug is true or hspVerifyInfos empty"); + return true; + } + std::ostringstream oss; + oss << "["; + bool first = true; + for (const auto& info : hspVerifyInfos) { + if (info.IsDebug()) { + if (!first) { + oss << ", "; + } + oss << info.GetModuleName(); + first = false; + } + } + oss << "]"; + for (const HapVerifyInfo& hapInfo : hspVerifyInfos) { + if (hapInfo.IsDebug()) { + LOGE("Detected HAP(s) with debug=false, but some HSP%s are debug=true. " + "Solution: When the debug value of Hap is false,the debug value of Hsp should also be false.", + oss.str().c_str()); + return false; + } } return true; } diff --git a/packing_tool/frameworks/test/unittest/json/hap_verify_utils_test/hap_verify_utils_test.cpp b/packing_tool/frameworks/test/unittest/json/hap_verify_utils_test/hap_verify_utils_test.cpp index 7de62972..575cdb79 100644 --- a/packing_tool/frameworks/test/unittest/json/hap_verify_utils_test/hap_verify_utils_test.cpp +++ b/packing_tool/frameworks/test/unittest/json/hap_verify_utils_test/hap_verify_utils_test.cpp @@ -346,53 +346,6 @@ HWTEST_F(HapVerifyUtilsTest, CheckAppFieldsIsSame_0500, Function | MediumTest | EXPECT_FALSE(utils.CheckAppFieldsIsSame(hapVerifyInfos)); } -/* - * @tc.name: CheckAppFieldsIsSame_0600 - * @tc.desc: CheckAppFieldsIsSame - * @tc.type: FUNC - * @tc.require: - */ -HWTEST_F(HapVerifyUtilsTest, CheckAppFieldsIsSame_0600, Function | MediumTest | Level1) -{ - std::list hapVerifyInfos; - OHOS::AppPackingTool::HapVerifyInfo hapVerifyInfo3; - hapVerifyInfo3.SetBundleName("test"); - hapVerifyInfo3.SetBundleType("hap"); - OHOS::AppPackingTool::Version version; - version.versionCode = 1; - version.versionName = "1.0.0"; - version.minCompatibleVersionCode = 1; - hapVerifyInfo3.SetVersion(version); - OHOS::AppPackingTool::ModuleApiVersion moduleApiVersion; - moduleApiVersion.compatibleApiVersion = 2; - moduleApiVersion.targetApiVersion = 1; - moduleApiVersion.releaseType = "release"; - hapVerifyInfo3.SetApiVersion(moduleApiVersion); - hapVerifyInfos.push_back(hapVerifyInfo1); - hapVerifyInfos.push_back(hapVerifyInfo3); - OHOS::AppPackingTool::HapVerifyUtils utils; - EXPECT_FALSE(utils.CheckAppFieldsIsSame(hapVerifyInfos)); - - std::list::iterator it; - it = --hapVerifyInfos.end(); - hapVerifyInfos.erase(it); - moduleApiVersion.compatibleApiVersion = 1; - moduleApiVersion.targetApiVersion = 2; - moduleApiVersion.releaseType = "release"; - hapVerifyInfo3.SetApiVersion(moduleApiVersion); - hapVerifyInfos.push_back(hapVerifyInfo3); - EXPECT_FALSE(utils.CheckAppFieldsIsSame(hapVerifyInfos)); - - it = --hapVerifyInfos.end(); - hapVerifyInfos.erase(it); - moduleApiVersion.compatibleApiVersion = 1; - moduleApiVersion.targetApiVersion = 1; - moduleApiVersion.releaseType = "debug"; - hapVerifyInfo3.SetApiVersion(moduleApiVersion); - hapVerifyInfos.push_back(hapVerifyInfo3); - EXPECT_FALSE(utils.CheckAppFieldsIsSame(hapVerifyInfos)); -} - /* * @tc.name: CheckAppFieldsIsSame_0700 * @tc.desc: CheckAppFieldsIsSame -- Gitee