1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3# Copyright (c) 2022-2025 Huawei Device Co., Ltd. 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15""" 16Archives a set of files. 17""" 18 19 20import os 21import sys 22import argparse 23import subprocess 24import re 25 26 27def run_cmd(title, cmd, time_out): 28 child_process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 29 cmd_out, cmd_err = child_process.communicate(timeout=time_out) 30 if child_process.returncode != 0: 31 print(cmd_out.decode('utf-8')) 32 print(cmd_err.decode('utf-8')) 33 raise Exception('compile module: ' + title + ' failed!') 34 35 36def get_compile_str(src_path, java_sources): 37 compile_java = '' 38 for src in java_sources: 39 if len(compile_java) == 0: 40 compile_java = '{}'.format(os.path.join(src_path, src)) 41 else: 42 compile_java = '{} {}'.format(compile_java, os.path.join(src_path, src)) 43 return compile_java 44 45 46def compile_haptobin_tool(root_path, src_path, jar_output, out_path, 47 toolchain, fastjson_jar, fastjson2_jar, fastjson2ext_jar): 48 java_sources = [ 49 'BinaryTool.java', 50 'BundleException.java', 51 'ConvertHapToBin.java', 52 'ErrorMsg.java', 53 'FileUtils.java', 54 'Log.java', 55 'PackFormatter.java', 56 'PackingToolErrMsg.java', 57 'Utility.java' 58 ] 59 compile_java = get_compile_str(src_path, java_sources) 60 61 shell_path = os.path.join(root_path, "haptobin.sh") 62 command = ['bash', shell_path, root_path, jar_output, out_path, 63 toolchain, compile_java, fastjson_jar, fastjson2_jar, fastjson2ext_jar] 64 print('command: ', command) 65 run_cmd('haptobin_tool', command, 5000) 66 return 67 68 69def compile_unpacking_tool(root_path, src_path, jar_output, out_path, big_version, 70 toolchain, fastjson_jar, fastjson2_jar, fastjson2ext_jar): 71 java_sources = [ 72 'AbilityFormInfo.java', 'AbilityInfo.java', 'ApiVersion.java', 73 'AppInfo.java', 'AppModel.java', 'APPQFResult.java', 74 'BundleException.java', 'CommandParser.java', 'CommonEvent.java', 75 'CountryCode.java', 'CustomizeData.java', 'DefinePermission.java', 76 'DefPermissionGroup.java', 'DefPermission.java', 'DependencyItem.java', 77 'DeviceConfig.java', 'DistroFilter.java', 'Distro.java', 'ErrorMsg.java', 78 'ExtensionAbilityInfo.java', 'FileUtils.java', 'FormInfo.java', 79 'HapInfo.java', 'HapZipInfo.java', 'HQFInfo.java', 80 'IntentInfo.java', 'JsInfo.java', 'JsonUtil.java', 81 'Log.java', 'MetaDataInfo.java', 'MetaData.java', 82 'ModuleAbilityInfo.java', 'ModuleAdaption.java', 'ModuleAppInfo.java', 83 'ModuleAtomicService.java', 'ModuleDeviceType.java', 'ModuleInfo.java', 84 'ModuleMetadataInfo.java', 'ModuleProfileInfo.java', 'ModuleResult.java', 85 'ModuleShortcut.java', 'PackFormatter.java', 'PackInfo.java', 'PackingToolErrMsg.java', 86 'PreloadItem.java', 'ProfileInfo.java', 'ReqPermission.java', 87 'ResourceIndexResult.java', 'ResourcesParser.java', 'ScreenDensity.java', 88 'ScreenShape.java', 'ScreenWindow.java', 'Shortcut.java', 89 'ShowHelp.java', 'SkillInfo.java', 'UncompressEntrance.java', 90 'Uncompress.java', 'UncompressResult.java', 'UncompressVerify.java', 91 'UriInfo.java', 'UsedScene.java', 'Utility.java', 'Want.java', 'ProxyDataItem.java' 92 ] 93 compile_java = get_compile_str(src_path, java_sources) 94 95 shell_path = os.path.join(root_path, "unpackingTool.sh") 96 command = ['bash', shell_path, root_path, jar_output, out_path, big_version, 97 toolchain, compile_java, fastjson_jar, fastjson2_jar, fastjson2ext_jar] 98 print('command: ', command) 99 run_cmd('app_unpacking_tool', command, 5000) 100 return 101 102 103def compile_packing_tool(root_path, src_path, jar_output, out_path, 104 toolchain, fastjson_jar, compress_jar, io_jar, fastjson2_jar, fastjson2ext_jar): 105 java_sources = [ 106 'ApiVersion.java', 107 'BundleException.java', 108 'CommandParser.java', 109 'CompressEntrance.java', 110 'Compressor.java', 111 'CompressVerify.java', 112 'Constants.java', 113 'CountryCode.java', 114 'DependencyItem.java', 115 'DistroFilter.java', 116 'ErrorMsg.java', 117 'FileUtils.java', 118 'HapVerify.java', 119 'HapVerifyInfo.java', 120 'HQFInfo.java', 121 'HQFVerify.java', 122 'Log.java', 123 'ModuleApiVersion.java', 124 'ModuleJsonInfo.java', 125 'ModuleJsonUtil.java', 126 'ModuleMetadataInfo.java', 127 'MultiAppMode.java', 128 'PackageNormalize.java', 129 'PackageUtil.java', 130 'PackFormatter.java', 131 'PackingToolErrMsg.java', 132 'PreloadItem.java', 133 'ScreenDensity.java', 134 'ScreenShape.java', 135 'ScreenWindow.java', 136 'ShowHelp.java', 137 'Utility.java', 138 'VerifyCollection.java', 139 'Version.java' 140 ] 141 compile_java = get_compile_str(src_path, java_sources) 142 143 shell_path = os.path.join(root_path, "packingTool.sh") 144 command = ['bash', shell_path, root_path, jar_output, out_path, 145 toolchain, compile_java, fastjson_jar, compress_jar, io_jar, fastjson2_jar, fastjson2ext_jar] 146 print('command: ', command) 147 run_cmd('app_packing_tool', command, 5000) 148 return 149 150 151def compile_check_tool(root_path, src_path, jar_output, out_path, 152 toolchain, fastjson_jar, fastjson2_jar, fastjson2ext_jar): 153 java_sources = [ 154 'BundleException.java', 155 'CommandParser.java', 156 'ErrorMsg.java', 157 'FileUtils.java', 158 'Log.java', 159 'PackFormatter.java', 160 'PackingToolErrMsg.java', 161 'Scan.java', 162 'ScanEntrance.java', 163 'ScanErrorEnum.java', 164 'ScanStatDuplicate.java', 165 'ScanStatFileSize.java', 166 'ScanStatSuffix.java', 167 'ScanVerify.java', 168 'ShowHelp.java', 169 'Utility.java' 170 ] 171 compile_java = get_compile_str(src_path, java_sources) 172 173 shell_path = os.path.join(root_path, "checkTool.sh") 174 command = ['bash', shell_path, root_path, jar_output, out_path, 175 toolchain, compile_java, fastjson_jar, fastjson2_jar, fastjson2ext_jar] 176 print('command: ', command) 177 run_cmd('app_check_tool', command, 5000) 178 return 179 180 181def main(): 182 parser = argparse.ArgumentParser() 183 parser.add_argument('--haptobin', required=True) 184 parser.add_argument('--haptobinOutput', required=True) 185 parser.add_argument('--unpackOutput', required=True) 186 parser.add_argument('--packOutput', required=True) 187 parser.add_argument('--checkOutput', required=True) 188 parser.add_argument('--outpath', required=True) 189 parser.add_argument('--toolchain', required=True) 190 parser.add_argument('--compileTarget', required=True) 191 args = parser.parse_args() 192 print('packingTool args: ', args) 193 root_dir = os.path.dirname(os.path.realpath(__file__)) 194 src_dir = os.path.join(root_dir, "./adapter/ohos/") 195 toolchain = args.toolchain 196 tool_list = toolchain.split(':') 197 toolchain = tool_list[-1] 198 toolchain += "_" + args.compileTarget 199 200 fastjson_jar = os.path.join(root_dir, '../../prebuilts/packing_tool/fastjson2mid/fastjson-2.0.52.jar') 201 fastjson2_jar = os.path.join(root_dir, '../../prebuilts/packing_tool/fastjson2/fastjson2-2.0.52.jar') 202 fastjson2ext_jar = os.path.join(root_dir, '../../prebuilts/packing_tool/fastjson2ext/fastjson2-extension-2.0.52.jar') 203 compress_jar = os.path.join(root_dir, '../../prebuilts/packing_tool/compress/commons-compress-1.26.1.jar') 204 io_jar = os.path.join(root_dir, 205 '../../prebuilts/packing_tool/io/commons-io-2.15.1-bin/commons-io-2.15.1/commons-io-2.15.1.jar') 206 print('packingTool: ', toolchain, fastjson_jar, compress_jar, io_jar, fastjson2_jar, fastjson2ext_jar) 207 208 # compile haptobin_tool.jar 209 compile_haptobin_tool(root_dir, src_dir, args.haptobinOutput, args.outpath, 210 toolchain, fastjson_jar, fastjson2_jar, fastjson2ext_jar) 211 212 # compile app_unpacking_tool.jar 213 version = subprocess.check_output(['javac', '-version'], stderr=subprocess.STDOUT) 214 version = version.decode('utf-8') 215 array = re.findall(r'\d+', version) 216 compatible_version = 8 217 big_version = '' 218 if int(array[0]) > compatible_version: 219 big_version = 'true' 220 else: 221 big_version = 'false' 222 compile_unpacking_tool(root_dir, src_dir, args.unpackOutput, args.outpath, big_version, 223 toolchain, fastjson_jar, fastjson2_jar, fastjson2ext_jar) 224 225 #compile app_packing_tool.jar 226 compile_packing_tool(root_dir, src_dir, args.packOutput, args.outpath, 227 toolchain, fastjson_jar, compress_jar, io_jar, fastjson2_jar, fastjson2ext_jar) 228 229 #compile app_check_tool.jar 230 compile_check_tool(root_dir, src_dir, args.checkOutput, args.outpath, 231 toolchain, fastjson_jar, fastjson2_jar, fastjson2ext_jar) 232 233if __name__ == '__main__': 234 sys.exit(main()) 235