1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3# Copyright (c) 2022-2024 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): 48 java_sources = [ 49 'BinaryTool.java', 50 'BundleException.java', 51 'ConvertHapToBin.java', 52 'FileUtils.java', 53 'Log.java', 54 'PackFormatter.java', 55 'Utility.java' 56 ] 57 compile_java = get_compile_str(src_path, java_sources) 58 59 shell_path = os.path.join(root_path, "haptobin.sh") 60 command = ['bash', shell_path, root_path, jar_output, out_path, 61 toolchain, compile_java, fastjson_jar] 62 print('command: ', command) 63 run_cmd('haptobin_tool', command, 5000) 64 return 65 66 67def compile_unpacking_tool(root_path, src_path, jar_output, out_path, big_version, 68 toolchain, fastjson_jar): 69 java_sources = [ 70 'AbilityFormInfo.java', 'AbilityInfo.java', 'ApiVersion.java', 71 'AppInfo.java', 'AppModel.java', 'APPQFResult.java', 72 'BundleException.java', 'CommandParser.java', 'CommonEvent.java', 73 'CountryCode.java', 'CustomizeData.java', 'DefinePermission.java', 74 'DefPermissionGroup.java', 'DefPermission.java', 'DependencyItem.java', 75 'DeviceConfig.java', 'DistroFilter.java', 'Distro.java', 76 'ExtensionAbilityInfo.java', 'FileUtils.java', 'FormInfo.java', 77 'HapInfo.java', 'HapZipInfo.java', 'HQFInfo.java', 78 'IntentInfo.java', 'JsInfo.java', 'JsonUtil.java', 79 'Log.java', 'MetaDataInfo.java', 'MetaData.java', 80 'ModuleAbilityInfo.java', 'ModuleAdaption.java', 'ModuleAppInfo.java', 81 'ModuleAtomicService.java', 'ModuleDeviceType.java', 'ModuleInfo.java', 82 'ModuleMetadataInfo.java', 'ModuleProfileInfo.java', 'ModuleResult.java', 83 'ModuleShortcut.java', 'PackFormatter.java', 'PackInfo.java', 84 'PreloadItem.java', 'ProfileInfo.java', 'ReqPermission.java', 85 'ResourceIndexResult.java', 'ResourcesParser.java', 'ScreenDensity.java', 86 'ScreenShape.java', 'ScreenWindow.java', 'Shortcut.java', 87 'ShowHelp.java', 'SkillInfo.java', 'UncompressEntrance.java', 88 'Uncompress.java', 'UncompressResult.java', 'UncompressVerify.java', 89 'UriInfo.java', 'UsedScene.java', 'Utility.java', 'Want.java', 'ProxyDataItem.java' 90 ] 91 compile_java = get_compile_str(src_path, java_sources) 92 93 shell_path = os.path.join(root_path, "unpackingTool.sh") 94 command = ['bash', shell_path, root_path, jar_output, out_path, big_version, 95 toolchain, compile_java, fastjson_jar] 96 print('command: ', command) 97 run_cmd('app_unpacking_tool', command, 5000) 98 return 99 100 101def compile_packing_tool(root_path, src_path, jar_output, out_path, 102 toolchain, fastjson_jar, compress_jar, io_jar): 103 java_sources = [ 104 'ApiVersion.java', 105 'BundleException.java', 106 'CommandParser.java', 107 'CompressEntrance.java', 108 'Compressor.java', 109 'CompressVerify.java', 110 'Constants.java', 111 'CountryCode.java', 112 'DependencyItem.java', 113 'DistroFilter.java', 114 'FileUtils.java', 115 'HapVerify.java', 116 'HapVerifyInfo.java', 117 'HQFInfo.java', 118 'HQFVerify.java', 119 'Log.java', 120 'ModuleApiVersion.java', 121 'ModuleJsonInfo.java', 122 'ModuleJsonUtil.java', 123 'ModuleMetadataInfo.java', 124 'MultiAppMode.java', 125 'PackageNormalize.java', 126 'PackageUtil.java', 127 'PackFormatter.java', 128 'PreloadItem.java', 129 'ScreenDensity.java', 130 'ScreenShape.java', 131 'ScreenWindow.java', 132 'ShowHelp.java', 133 'Utility.java', 134 'VerifyCollection.java', 135 'Version.java' 136 ] 137 compile_java = get_compile_str(src_path, java_sources) 138 139 shell_path = os.path.join(root_path, "packingTool.sh") 140 command = ['bash', shell_path, root_path, jar_output, out_path, 141 toolchain, compile_java, fastjson_jar, compress_jar, io_jar] 142 print('command: ', command) 143 run_cmd('app_packing_tool', command, 5000) 144 return 145 146 147def compile_check_tool(root_path, src_path, jar_output, out_path, 148 toolchain, fastjson_jar): 149 java_sources = [ 150 'BundleException.java', 151 'CommandParser.java', 152 'FileUtils.java', 153 'Log.java', 154 'PackFormatter.java', 155 'Scan.java', 156 'ScanEntrance.java', 157 'ScanErrorEnum.java', 158 'ScanStatDuplicate.java', 159 'ScanStatFileSize.java', 160 'ScanStatSuffix.java', 161 'ScanVerify.java', 162 'ShowHelp.java', 163 'Utility.java' 164 ] 165 compile_java = get_compile_str(src_path, java_sources) 166 167 shell_path = os.path.join(root_path, "checkTool.sh") 168 command = ['bash', shell_path, root_path, jar_output, out_path, 169 toolchain, compile_java, fastjson_jar] 170 print('command: ', command) 171 run_cmd('app_check_tool', command, 5000) 172 return 173 174 175def main(): 176 parser = argparse.ArgumentParser() 177 parser.add_argument('--haptobin', required=True) 178 parser.add_argument('--haptobinOutput', required=True) 179 parser.add_argument('--unpackOutput', required=True) 180 parser.add_argument('--packOutput', required=True) 181 parser.add_argument('--checkOutput', required=True) 182 parser.add_argument('--outpath', required=True) 183 parser.add_argument('--toolchain', required=True) 184 parser.add_argument('--compileTarget', required=True) 185 args = parser.parse_args() 186 print('packingTool args: ', args) 187 root_dir = os.path.dirname(os.path.realpath(__file__)) 188 src_dir = os.path.join(root_dir, "./adapter/ohos/") 189 toolchain = args.toolchain 190 tool_list = toolchain.split(':') 191 toolchain = tool_list[-1] 192 toolchain += "_" + args.compileTarget 193 194 fastjson_jar = os.path.join(root_dir, '../../prebuilts/packing_tool/fastjson-1.2.83.jar') 195 compress_jar = os.path.join(root_dir, '../../prebuilts/packing_tool/commons-compress-1.26.1.jar') 196 io_jar = os.path.join(root_dir, '../../prebuilts/packing_tool/commons-io-2.15.1.jar') 197 print('packingTool: ', toolchain, fastjson_jar, compress_jar, io_jar) 198 199 # compile haptobin_tool.jar 200 compile_haptobin_tool(root_dir, src_dir, args.haptobinOutput, args.outpath, 201 toolchain, fastjson_jar) 202 203 # compile app_unpacking_tool.jar 204 version = subprocess.check_output(['javac', '-version'], stderr=subprocess.STDOUT) 205 version = version.decode('utf-8') 206 array = re.findall(r'\d+', version) 207 compatible_version = 8 208 big_version = '' 209 if int(array[0]) > compatible_version: 210 big_version = 'true' 211 else: 212 big_version = 'false' 213 compile_unpacking_tool(root_dir, src_dir, args.unpackOutput, args.outpath, big_version, 214 toolchain, fastjson_jar) 215 216 #compile app_packing_tool.jar 217 compile_packing_tool(root_dir, src_dir, args.packOutput, args.outpath, 218 toolchain, fastjson_jar, compress_jar, io_jar) 219 220 #compile app_check_tool.jar 221 compile_check_tool(root_dir, src_dir, args.checkOutput, args.outpath, 222 toolchain, fastjson_jar) 223 224if __name__ == '__main__': 225 sys.exit(main()) 226