diff --git a/adapter/ohos/CommandParser.java b/adapter/ohos/CommandParser.java index 4b0f7077ce75271490fcae3876c7c6e91cede0c4..c2eca26f6c9d0834a1998c30bd87b400cebc33e0 100644 --- a/adapter/ohos/CommandParser.java +++ b/adapter/ohos/CommandParser.java @@ -80,6 +80,7 @@ public class CommandParser { private static final String CMD_APPQF_PATH = "--appqf-path"; private static final String CMD_AN_PATH = "--an-path"; private static final String CMD_AP_PATH = "--ap-path"; + private static final String CMD_DATA = "--data"; private static final String MAIN_MODULE_LIMIT = "--main-module-limit"; private static final String NORMAL_MODULE_LIMIT = "--normal-module-limit"; private static final String TOTAL_LIMIT = "--total-limit"; @@ -271,6 +272,10 @@ public class CommandParser { entry.getKey().setAPPath(entry.getValue()); return true; }); + commandFuncs.put(CMD_DATA, entry -> { + entry.getKey().setData(entry.getValue()); + return true; + }); commandFuncs.put(MAIN_MODULE_LIMIT, entry -> { entry.getKey().setMainModuleLimit(entry.getValue()); return true; diff --git a/adapter/ohos/CompressVerify.java b/adapter/ohos/CompressVerify.java index eeda7375c6d08dfeff9cb360367d0d84517dfd46..cbe07b20bfde2c184b7be422de35dcd9d93a1de3 100644 --- a/adapter/ohos/CompressVerify.java +++ b/adapter/ohos/CompressVerify.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.alibaba.fastjson.JSONObject; /** * compress comment,command parser. @@ -53,6 +54,7 @@ public class CompressVerify { private static final String FALSE = "false"; private static final String ENTRY_CARD_DIRECTORY_NAME = "EntryCard"; private static final String VERSION_NAME_PATTERN = "^[0-9.]+|(?=.*[{])(?=.*[}])[0-9a-zA-Z_.{}]+$"; + private static final String DATA_LABEL_FIELD = "data_label"; private static final Log LOG = new Log(CompressVerify.class.toString()); @@ -108,6 +110,8 @@ public class CompressVerify { return isVerifyValidInAPPQFMode(utility); case Utility.MODE_HSP: return isVerifyValidInHspMode(utility); + case Utility.MODE_HAPADDITION: + return isVerifyValidInHapadditionMode(utility); case Utility.VERSION_NORMALIZE: return validateVersionNormalizeMode(utility); default: @@ -809,6 +813,39 @@ public class CompressVerify { return isOutPathValid(utility, HSP_SUFFIX); } + private static boolean isDataValid(String json) { + if ("{}".equals(json) || (json.length() > 2 && json.charAt(0) == '{' && json.charAt(json.length()-1) == '}')) { + try { + JSONObject obj = JSONObject.parseObject(json); + if(obj.containsKey(DATA_LABEL_FIELD)) { + if (obj.get(DATA_LABEL_FIELD).equals(true) || obj.get(DATA_LABEL_FIELD).equals(false)){ + return false; + } else { + return true; + } + } else { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + return true; + } + } + LOG.warning(json); + return false; + } + + private static boolean isVerifyValidInHapadditionMode(Utility utility) { + if (utility.getHapPath().isEmpty()) { + return false; + } + if (isDataValid(utility.getData())) { + LOG.error("CompressVerify::isArgsValidInHapMode data is invalid."); + return false; + } + + return isOutPathValid(utility, HAP_SUFFIX); + } private static boolean isSharedApp(Utility utility) { if (!utility.getHapPath().isEmpty()) { diff --git a/adapter/ohos/Compressor.java b/adapter/ohos/Compressor.java index f4010bdaaf7a2b1695d73a180d03b94c79c9b78c..3255e1e5e3d93801668ac190d20a191d8ddedb37 100644 --- a/adapter/ohos/Compressor.java +++ b/adapter/ohos/Compressor.java @@ -15,18 +15,7 @@ package ohos; -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; +import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -34,13 +23,7 @@ import java.nio.file.Paths; import java.nio.file.attribute.FileTime; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Optional; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.CRC32; @@ -65,6 +48,7 @@ public class Compressor { private static final String CONFIG_JSON = "config.json"; private static final String MODULE_JSON = "module.json"; private static final String PATCH_JSON = "patch.json"; + private static final String ADDITION_JSON = "addition.json"; private static final String NAME = "name"; private static final String NULL_DIR_NAME = ""; private static final String RES_DIR_NAME = "res/"; @@ -135,6 +119,9 @@ public class Compressor { private static final String ASSETS_FILE_NAME = "assets"; private static final String MAPLE_FILE_NAME = "maple"; private static final String SHARED_LIBS_FILE_NAME = "shared_libs"; + private static final String HAPADDITION_FOLDER_NAME = "hapaddition"; + private static final String TARGET_FILE_PATH = HAPADDITION_FOLDER_NAME + + "\\resources\\base\\profile\\" + ADDITION_JSON; // set timestamp to get fixed MD5 private static final long FILE_TIME = 1546272000000L; @@ -365,6 +352,9 @@ public class Compressor { case Utility.MODE_HSP: compressHsp(utility); break; + case Utility.MODE_HAPADDITION: + compressHapaddition(utility); + break; default: compressPackResMode(utility); } @@ -1106,6 +1096,75 @@ public class Compressor { } } + /** + * compress in hapaddition mode. + * + * @param utility common data + * @throws BundleException FileNotFoundException|IOException. + */ + private void compressHapaddition(Utility utility) throws BundleException { + // 生成 addition.json 文件 + String data = utility.getData(); + JSONObject dataJson = JSONObject.parseObject(data); + try { + FileWriter fileWriter = new FileWriter(ADDITION_JSON); + // 格式化 json 换行 + String pretty = JSON.toJSONString(dataJson, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue); + fileWriter.write(pretty); + fileWriter.flush(); + fileWriter.close(); + } catch (IOException e) { + String errMsg = "Compressor::compressHapaddition jsonfile failed."; + LOG.error(errMsg); + throw new BundleException(errMsg); + } + + // 解压 hap 文件 至 一个新的文件夹 hapaddition + String currentDir = System.getProperty("user.dir"); + String oldOutPath = utility.getOutPath(); + String hapadditionPath = currentDir+ "\\" + HAPADDITION_FOLDER_NAME; + utility.setOutPath(hapadditionPath); + ohos.Uncompress.unpackageProcess(utility); + utility.setOutPath(oldOutPath); + + // 移动 addition.json 至相关目录 + File source = new File(currentDir + "\\" + ADDITION_JSON); + File target = new File(currentDir + "\\" + TARGET_FILE_PATH); + try { + source.renameTo(target); + } catch (Exception e) { + String errMsg = "Compressor::compressHapaddition renameTo failed."; + LOG.error(errMsg); + throw new BundleException(errMsg); + } + + // 打包新的hap文件 + File directory = new File(hapadditionPath); + File[] files = directory.listFiles(); + for (File f : files) { + if (MODULE_JSON.equals(f.getName())) { + utility.setJsonPath(hapadditionPath + "\\" + MODULE_JSON); + } else if (CONFIG_JSON.equals(f.getName())){ + utility.setJsonPath(hapadditionPath + "\\" + CONFIG_JSON); + } + if (ETS_FILE_NAME.equals(f.getName())) { + utility.setEtsPath(hapadditionPath + "\\" + ETS_FILE_NAME); + } + if (PACKINFO_NAME.equals(f.getName())) { + utility.setPackInfoPath(hapadditionPath + "\\" + PACKINFO_NAME); + } + if (RESOURCE_FILE_NAME.equals(f.getName())) { + utility.setResourcesPath(hapadditionPath + "\\" + RESOURCE_FILE_NAME); + } + if (RES_INDEX.equals(f.getName())) { + utility.setIndexPath(hapadditionPath + "\\" + RES_INDEX); + } + } + compressHap(utility); + // 删除打包解包过程文件 + deleteFile(hapadditionPath); + } + /** * pack hap in app to selectedHaps * diff --git a/adapter/ohos/Uncompress.java b/adapter/ohos/Uncompress.java index c837c8b9a6f7ae003d79a029dda756d680dc7f6a..93057bab9872d448a229932a4b4e65685c003c24 100644 --- a/adapter/ohos/Uncompress.java +++ b/adapter/ohos/Uncompress.java @@ -122,6 +122,9 @@ public class Uncompress { case Utility.MODE_HSP: dataTransferAllFiles(utility.getHspPath(), utility.getOutPath()); break; + case Utility.MODE_HAPADDITION: + unpackageHapadditionMode(utility); + break; default: LOG.error("Uncompress::unpackageProcess input wrong type!"); throw new BundleException("Uncompress::unpackageProcess input wrong type!"); @@ -164,6 +167,33 @@ public class Uncompress { throw new BundleException("Uncompress::unpackageHapMode failed"); } } + /** + * unpack hapaddition. + * + * @param utility common data + */ + static void unpackageHapadditionMode(Utility utility) throws BundleException { + if (!Utility.MODE_HAPADDITION.equals(utility.getMode())) { + throw new BundleException("Uncompress::unpackageHapadditionMode input wrong unpack mode"); + } + try { + if (TRUE.equals(utility.getRpcid())) { + getRpcidFromHap(utility.getHapPath(), utility.getOutPath()); + return; + } + if (TRUE.equals(utility.getUnpackApk())) { + unzip(utility, utility.getHapPath(), utility.getOutPath(), APK_SUFFIX); + String[] temp = utility.getHapPath().replace("\\", "/").split("/"); + String hapName = temp[temp.length - 1]; + repackHap(utility.getHapPath(), utility.getOutPath(), hapName, utility.getUnpackApk()); + } else { + dataTransferAllFiles(utility.getHapPath(), utility.getOutPath()); + } + } catch (BundleException e) { + LOG.error("Uncompress::unpackageHapMode failed"); + throw new BundleException("Uncompress::unpackageHapMode failed"); + } + } /** * uncompress app. diff --git a/adapter/ohos/Utility.java b/adapter/ohos/Utility.java index 40e8713c319234809656e71f436300b9464ececa..03e999283132a4c8b8ab58c36aa3e6622371de59 100644 --- a/adapter/ohos/Utility.java +++ b/adapter/ohos/Utility.java @@ -35,6 +35,7 @@ public class Utility { static final String MODE_APPQF = "appqf"; static final String MODE_RES = "res"; static final String MODE_HSP = "hsp"; + static final String MODE_HAPADDITION = "hapaddition"; static final String VERSION_NORMALIZE = "versionNormalize"; static final String FALSE_STRING = "false"; @@ -94,6 +95,7 @@ public class Utility { private String mainModuleLimit = ""; private String normalModuleLimit = ""; private String totalLimit = ""; + private String data = ""; private boolean generateBuildHash = false; private boolean buildHashFinish = false; @@ -728,6 +730,16 @@ public class Utility { return this.apPath; } + public void setData(String data) { + if (!hapPath.startsWith(CMD_PREFIX)) { + this.data = data; + } + } + + public String getData() { + return this.data; + } + public void setIsSharedApp(boolean isSharedApp) { this.isSharedApp = isSharedApp; }