From eb3f00e40b82f01759d1ba02df9e7ad7c20486c0 Mon Sep 17 00:00:00 2001 From: longwei Date: Wed, 20 Jul 2022 10:39:25 +0800 Subject: [PATCH] add dependency verify when pack app Signed-off-by: longwei Change-Id: I00f9d36eb5d92b2df9541a788c938c44d013c2fe --- adapter/ohos/HapVerify.java | 136 ++++++++++++++++++++++++++++++- adapter/ohos/HapVerifyInfo.java | 4 + adapter/ohos/ModuleJsonUtil.java | 44 +++++++++- jar/app_packing_tool.jar | Bin 309627 -> 311205 bytes 4 files changed, 179 insertions(+), 5 deletions(-) diff --git a/adapter/ohos/HapVerify.java b/adapter/ohos/HapVerify.java index 5e510281..9b1a03c5 100644 --- a/adapter/ohos/HapVerify.java +++ b/adapter/ohos/HapVerify.java @@ -28,6 +28,8 @@ class HapVerify { private static final String INCLUDE = "include"; private static final String EXCLUDE = "exclude"; private static final Log LOG = new Log(ModuleJsonUtil.class.toString()); + private static final int SERVICE_DEPTH = 2; + private static final int APPLICATION_DEPTH = 5; /** * check hap is verify. @@ -37,7 +39,7 @@ class HapVerify { * @return the result */ public static boolean checkHapIsValid(List hapVerifyInfos) throws BundleException { - if (hapVerifyInfos.isEmpty()) { + if (hapVerifyInfos == null || hapVerifyInfos.isEmpty()) { LOG.error("HapVerify::checkHapIsValid hapVerifyInfos is empty!"); return false; } @@ -66,6 +68,11 @@ class HapVerify { LOG.error("HapVerify::checkHapIsValid failed, entry is not valid!"); return false; } + // check dependency is valid + if (!checkDependencyIsValid(hapVerifyInfos)) { + LOG.error("HapVerify::checkHapIsValid failed, dependency is invalid"); + return false; + } return true; } @@ -281,6 +288,7 @@ class HapVerify { if (checkDistroFilterDisjoint(hapVerifyInfoLeft.distroFilter, hapVerifyInfoRight.distroFilter)) { return true; } + return false; } @@ -327,7 +335,6 @@ class HapVerify { return true; } } - LOG.error("HapVerify::checkDistroFilterDisjoint two distroFilter duplicated!"); return false; } @@ -739,4 +746,129 @@ class HapVerify { exclude.removeAll(include); return Collections.disjoint(exclude, value); } + + /** + * check dependency is valid + * + * @param allHapVerifyInfo is all input hap module + * @return true if dependency is valid + */ + private static boolean checkDependencyIsValid(List allHapVerifyInfo) throws BundleException { + if (allHapVerifyInfo.isEmpty()) { + LOG.error("HapVerify::checkDependencyIsValid failed, input none hap!"); + throw new BundleException("HapVerify::checkDependencyIsValid failed, input none hap!"); + } + boolean installationFree = allHapVerifyInfo.get(0).installationFree; + for (HapVerifyInfo hapVerifyInfo : allHapVerifyInfo) { + if (installationFree != hapVerifyInfo.installationFree) { + LOG.error("HapVerify::checkDependencyIsValid installationFree is different in input hap!"); + return false; + } + } + int depth = installationFree ? SERVICE_DEPTH : APPLICATION_DEPTH; + for (HapVerifyInfo hapVerifyInfo : allHapVerifyInfo) { + List dependencyList = new ArrayList<>(); + dependencyList.add(hapVerifyInfo); + if (!DFSTraverseDependency(hapVerifyInfo, allHapVerifyInfo, dependencyList, depth)) { + return false; + } + dependencyList.remove(dependencyList.size() - 1); + } + return true; + } + + /** + * DFS traverse dependency, and check dependency list ia valid + * + * @param hapVerifyInfo the first node of dependency list + * @param allHapVerifyInfo is all input hap module + * @param dependencyList is the current dependency list + * @param depth is th limit of depth + * @return true if dependency list is valid + */ + private static boolean DFSTraverseDependency(HapVerifyInfo hapVerifyInfo, List allHapVerifyInfo, + List dependencyList, int depth) throws BundleException { + // check dependencyList is valid + if (checkDependencyListCirculate(dependencyList)) { + return false; + } + if (dependencyList.size() > depth + 1) { + LOG.error("HapVerify::DFSTraverseDependency " + dependencyList.get(0).moduleName + " depth exceed!"); + return false; + } + for (String dependency : hapVerifyInfo.dependencies) { + List layerDependencyList = getLayerDependency(dependency, hapVerifyInfo, allHapVerifyInfo); + for(HapVerifyInfo item : layerDependencyList) { + dependencyList.add(item); + if (!DFSTraverseDependency(item, allHapVerifyInfo, dependencyList, depth)) { + return false; + } + dependencyList.remove(dependencyList.size() - 1); + } + } + return true; + } + + /** + * get one layer dependency module by moduleName + * + * @param moduleName is the dependency moduleName of module + * @param hapVerifyInfo the first node of dependency list + * @param allHapVerifyInfo is all input hap module + * @return a layer dependency list + */ + private static List getLayerDependency(String moduleName, HapVerifyInfo hapVerifyInfo, + List allHapVerifyInfo) throws BundleException { + List layerHapVerifyInfoList = new ArrayList<>(); + for (HapVerifyInfo item : allHapVerifyInfo) { + if (item.moduleName.equals(moduleName) && checkModuleJoint(hapVerifyInfo, item)) { + layerHapVerifyInfoList.add(item); + } + } + return layerHapVerifyInfoList; + } + + /** + * check two module is joint + * + * @param infoLeft is one hapVerifyInfo + * @param infoRight is another hapVerifyInfo + * @return true if dependency list is valid + */ + private static boolean checkModuleJoint(HapVerifyInfo infoLeft, HapVerifyInfo infoRight) throws BundleException { + return !checkDuplicatedIsValid(infoLeft, infoRight); + } + + /** + * check dependency list is circulate + * + * @param dependencyList is current dependency list + * @return true if dependency list is circulate + */ + private static boolean checkDependencyListCirculate(List dependencyList) throws BundleException { + for (int i = 0; i < dependencyList.size() - 1; ++i) { + for (int j = i + 1; j < dependencyList.size(); ++j) { + if (isSameHapVerifyInfo(dependencyList.get(i), dependencyList.get(j))) { + LOG.error("HapVerify::checkDependencyListIsValid circular dependency, module is " + + dependencyList.get(0).moduleName); + return true; + } + } + } + return false; + } + + /** + * check two hapVerifyInfo is same.If two module has same moduleName and joint, they are the same hapVerifyInfo + * + * @param infoLeft is one hapVerifyInfo + * @param infoRight is another hapVerifyInfo + * @return true two hapVerifyInfo is same + */ + private static boolean isSameHapVerifyInfo(HapVerifyInfo infoLeft, HapVerifyInfo infoRight) throws BundleException { + if (!infoLeft.moduleName.equals(infoRight.moduleName)) { + return false; + } + return checkModuleJoint(infoLeft, infoRight); + } } diff --git a/adapter/ohos/HapVerifyInfo.java b/adapter/ohos/HapVerifyInfo.java index 2e476d8f..eac626eb 100644 --- a/adapter/ohos/HapVerifyInfo.java +++ b/adapter/ohos/HapVerifyInfo.java @@ -64,6 +64,10 @@ class HapVerifyInfo { * Indicates is entry of module. */ public boolean isEntry = false; + /** + * Indicates is installationFree of module. + */ + public boolean installationFree = false; /** * Indicates dependency of module. */ diff --git a/adapter/ohos/ModuleJsonUtil.java b/adapter/ohos/ModuleJsonUtil.java index 5a135fdb..dca9d17b 100644 --- a/adapter/ohos/ModuleJsonUtil.java +++ b/adapter/ohos/ModuleJsonUtil.java @@ -68,6 +68,7 @@ class ModuleJsonUtil { private static final String DISTROFILTER = "distroFilter"; private static final String DEPENDENCIES = "dependencies"; private static final String EXTENSIONABILITIES = "extensionAbilities"; + private static final String INSTALLATIONFREE = "installationFree"; private static final Log LOG = new Log(ModuleJsonUtil.class.toString()); /** @@ -786,6 +787,7 @@ class ModuleJsonUtil { hapVerifyInfo.abilityNames.addAll(extensionAbilityNames); hapVerifyInfo.isEntry = parseStageIsEntry(hapVerifyInfo.profileStr); hapVerifyInfo.dependencies = parseDependencies(hapVerifyInfo.profileStr); + hapVerifyInfo.installationFree = parseStageInstallation(hapVerifyInfo.profileStr); } /** @@ -810,6 +812,7 @@ class ModuleJsonUtil { hapVerifyInfo.isEntry = parseFAIsEntry(hapVerifyInfo.profileStr); hapVerifyInfo.packageName = parseFaPackageStr(hapVerifyInfo.profileStr); hapVerifyInfo.dependencies = parseDependencies(hapVerifyInfo.profileStr); + hapVerifyInfo.installationFree = parseFAInstallationFree(hapVerifyInfo.profileStr); } /** @@ -1024,16 +1027,51 @@ class ModuleJsonUtil { * @param jsonString is the json String of module.json or config.json * @return dependencies */ - static List parseDependencies(String jsonString) { + static List parseDependencies(String jsonString) throws BundleException { List dependencies = new ArrayList<>(); JSONObject jsonObj = JSON.parseObject(jsonString); - if (jsonObj.containsKey(MODULE)) { - JSONObject moduleObj = jsonObj.getJSONObject(MODULE); + JSONObject moduleObj = jsonObj.getJSONObject(MODULE); + if (moduleObj == null) { + LOG.error("ModuleJsonUtil::parseStageInstallation json do not contain module!"); + throw new BundleException("ModuleJsonUtil::parseStageInstallation json do not contain module!"); + } + if (moduleObj.containsKey(DEPENDENCIES)) { dependencies = JSONObject.parseArray(getJsonString(moduleObj, DEPENDENCIES), String.class); } return dependencies; } + static boolean parseStageInstallation(String jsonString) throws BundleException { + JSONObject jsonObj = JSON.parseObject(jsonString); + JSONObject moduleObj = jsonObj.getJSONObject(MODULE); + if (moduleObj == null) { + LOG.error("ModuleJsonUtil::parseStageInstallation json do not contain module!"); + throw new BundleException("ModuleJsonUtil::parseStageInstallation json do not contain module!"); + } + if (moduleObj.containsKey(INSTALLATIONFREE)) { + return moduleObj.getBoolean(INSTALLATIONFREE); + } + return false; + } + + static boolean parseFAInstallationFree(String jsonString) throws BundleException { + JSONObject jsonObject = JSON.parseObject(jsonString); + JSONObject moduleObj = jsonObject.getJSONObject(MODULE); + if (moduleObj == null) { + LOG.error("ModuleJsonUtil::parseStageInstallation json do not contain module!"); + throw new BundleException("ModuleJsonUtil::parseStageInstallation json do not contain module!"); + } + JSONObject distroObj = moduleObj.getJSONObject(DISTRO); + if (distroObj == null) { + LOG.error("ModuleJsonUtil::parseStageInstallation json do not contain distro!"); + throw new BundleException("ModuleJsonUtil::parseStageInstallation json do not contain distro!"); + } + if (distroObj.containsKey(INSTALLATIONFREE)) { + return distroObj.getBoolean(INSTALLATIONFREE); + } + return false; + } + /** * get the String from JSONObject by the key. * diff --git a/jar/app_packing_tool.jar b/jar/app_packing_tool.jar index 23592cd48c0ca70c52dcafd51d9d3cf8903e69dd..ab22f13b1130226622658fe4cc0b48cfcf97e23c 100644 GIT binary patch delta 21576 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 delta 19875 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 -- Gitee