• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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', 'restool/ResourcesParser.java', 'restool/ResourcesParserV1.java',
88        'restool/ResourcesParserV2.java', 'restool/ResourcesParserFactory.java', 'ScreenDensity.java',
89        'ScreenShape.java', 'ScreenWindow.java', 'Shortcut.java',
90        'ShowHelp.java', 'SkillInfo.java', 'UncompressEntrance.java',
91        'Uncompress.java', 'UncompressResult.java', 'UncompressVerify.java',
92        'UriInfo.java', 'UsedScene.java', 'Utility.java', 'Want.java', 'ProxyDataItem.java'
93    ]
94    compile_java = get_compile_str(src_path, java_sources)
95
96    shell_path = os.path.join(root_path, "unpackingTool.sh")
97    command = ['bash', shell_path, root_path, jar_output, out_path, big_version,
98               toolchain, compile_java, fastjson_jar, fastjson2_jar, fastjson2ext_jar]
99    print('command: ', command)
100    run_cmd('app_unpacking_tool', command, 5000)
101    return
102
103
104def compile_packing_tool(root_path, src_path, jar_output, out_path,
105                         toolchain, fastjson_jar, compress_jar, io_jar, fastjson2_jar, fastjson2ext_jar):
106    java_sources = [
107        'ApiVersion.java',
108        'BundleException.java',
109        'CommandParser.java',
110        'CompressEntrance.java',
111        'Compressor.java',
112        'CompressVerify.java',
113        'Constants.java',
114        'CountryCode.java',
115        'DependencyItem.java',
116        'DistroFilter.java',
117        'ErrorMsg.java',
118        'FileUtils.java',
119        'HapVerify.java',
120        'HapVerifyInfo.java',
121        'HQFInfo.java',
122        'HQFVerify.java',
123        'Log.java',
124        'ModuleApiVersion.java',
125        'ModuleJsonInfo.java',
126        'ModuleJsonUtil.java',
127        'ModuleMetadataInfo.java',
128        'MultiAppMode.java',
129        'PackageNormalize.java',
130        'PackageUtil.java',
131        'PackFormatter.java',
132        'PackingToolErrMsg.java',
133        'PreloadItem.java',
134        'ScreenDensity.java',
135        'ScreenShape.java',
136        'ScreenWindow.java',
137        'ShowHelp.java',
138        'Utility.java',
139        'VerifyCollection.java',
140        'Version.java'
141    ]
142    compile_java = get_compile_str(src_path, java_sources)
143
144    shell_path = os.path.join(root_path, "packingTool.sh")
145    command = ['bash', shell_path, root_path, jar_output, out_path,
146               toolchain, compile_java, fastjson_jar, compress_jar, io_jar, fastjson2_jar, fastjson2ext_jar]
147    print('command: ', command)
148    run_cmd('app_packing_tool', command, 5000)
149    return
150
151
152def compile_check_tool(root_path, src_path, jar_output, out_path,
153                       toolchain, fastjson_jar, fastjson2_jar, fastjson2ext_jar):
154    java_sources = [
155        'BundleException.java',
156        'CommandParser.java',
157        'ErrorMsg.java',
158        'FileUtils.java',
159        'Log.java',
160        'PackFormatter.java',
161        'PackingToolErrMsg.java',
162        'Scan.java',
163        'ScanEntrance.java',
164        'ScanErrorEnum.java',
165        'ScanStatDuplicate.java',
166        'ScanStatFileSize.java',
167        'ScanStatSuffix.java',
168        'ScanVerify.java',
169        'ShowHelp.java',
170        'Utility.java'
171    ]
172    compile_java = get_compile_str(src_path, java_sources)
173
174    shell_path = os.path.join(root_path, "checkTool.sh")
175    command = ['bash', shell_path, root_path, jar_output, out_path,
176               toolchain, compile_java, fastjson_jar, fastjson2_jar, fastjson2ext_jar]
177    print('command: ', command)
178    run_cmd('app_check_tool', command, 5000)
179    return
180
181
182def main():
183    parser = argparse.ArgumentParser()
184    parser.add_argument('--haptobin', required=True)
185    parser.add_argument('--haptobinOutput', required=True)
186    parser.add_argument('--unpackOutput', required=True)
187    parser.add_argument('--packOutput', required=True)
188    parser.add_argument('--checkOutput', required=True)
189    parser.add_argument('--outpath', required=True)
190    parser.add_argument('--toolchain', required=True)
191    parser.add_argument('--compileTarget', required=True)
192    args = parser.parse_args()
193    print('packingTool args: ', args)
194    root_dir = os.path.dirname(os.path.realpath(__file__))
195    src_dir = os.path.join(root_dir, "./adapter/ohos/")
196    toolchain = args.toolchain
197    tool_list = toolchain.split(':')
198    toolchain = tool_list[-1]
199    toolchain += "_" + args.compileTarget
200
201    fastjson_jar = os.path.join(root_dir, '../../prebuilts/packing_tool/fastjson2mid/fastjson-2.0.52.jar')
202    fastjson2_jar = os.path.join(root_dir, '../../prebuilts/packing_tool/fastjson2/fastjson2-2.0.52.jar')
203    fastjson2ext_jar = os.path.join(root_dir, '../../prebuilts/packing_tool/fastjson2ext/fastjson2-extension-2.0.52.jar')
204    compress_jar = os.path.join(root_dir, '../../prebuilts/packing_tool/compress/commons-compress-1.26.1.jar')
205    io_jar = os.path.join(root_dir,
206        '../../prebuilts/packing_tool/io/commons-io-2.15.1-bin/commons-io-2.15.1/commons-io-2.15.1.jar')
207    print('packingTool: ', toolchain, fastjson_jar, compress_jar, io_jar, fastjson2_jar, fastjson2ext_jar)
208
209    # compile haptobin_tool.jar
210    compile_haptobin_tool(root_dir, src_dir, args.haptobinOutput, args.outpath,
211                          toolchain, fastjson_jar, fastjson2_jar, fastjson2ext_jar)
212
213    # compile app_unpacking_tool.jar
214    version = subprocess.check_output(['javac', '-version'], stderr=subprocess.STDOUT)
215    version = version.decode('utf-8')
216    array = re.findall(r'\d+', version)
217    compatible_version = 8
218    big_version = ''
219    if int(array[0]) > compatible_version:
220        big_version = 'true'
221    else:
222        big_version = 'false'
223    compile_unpacking_tool(root_dir, src_dir, args.unpackOutput, args.outpath, big_version,
224                           toolchain, fastjson_jar, fastjson2_jar, fastjson2ext_jar)
225
226    #compile app_packing_tool.jar
227    compile_packing_tool(root_dir, src_dir, args.packOutput, args.outpath,
228                         toolchain, fastjson_jar, compress_jar, io_jar, fastjson2_jar, fastjson2ext_jar)
229
230    #compile app_check_tool.jar
231    compile_check_tool(root_dir, src_dir, args.checkOutput, args.outpath,
232                       toolchain, fastjson_jar, fastjson2_jar, fastjson2ext_jar)
233
234if __name__ == '__main__':
235    sys.exit(main())
236