• 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', '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