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