1/* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import fs from 'fs'; 17import path from 'path'; 18 19import { ArkObfuscator } from '../ArkObfuscator'; 20import { collectResevedFileNameInIDEConfig, MergedConfig, ObConfigResolver, readNameCache } from './ConfigResolver'; 21import { type IOptions } from '../configs/IOptions'; 22 23export const printerConfig = { 24 // Print obfuscation time&memory usage of all files and obfuscation processes 25 mFilesPrinter: false, 26 // Print time&memory usage of a single file obfuscation in transform processes 27 mSingleFilePrinter: false, 28 // Print sum up time of transform processes during obfuscation 29 mSumPrinter: false, 30 // Output path of printer 31 mOutputPath: '', 32}; 33 34export function initObfuscationConfig(projectConfig: any, arkProjectConfig: any, logger: any): void { 35 const obConfig: ObConfigResolver = new ObConfigResolver(projectConfig, logger, true); 36 const mergedObConfig: MergedConfig = obConfig.resolveObfuscationConfigs(); 37 const isHarCompiled: boolean = projectConfig.compileHar; 38 if (mergedObConfig.options.disableObfuscation) { 39 return; 40 } 41 42 if (mergedObConfig.options.enableFileNameObfuscation) { 43 const ohPackagePath = path.join(projectConfig.modulePath, 'oh-package.json5'); 44 const entryArray = arkProjectConfig.entryArrayForObf; 45 const reservedFileNamesInIDEconfig = collectResevedFileNameInIDEConfig( 46 ohPackagePath, 47 projectConfig, 48 arkProjectConfig.modulePathMap, 49 entryArray, 50 ); 51 mergedObConfig.reservedFileNames.push(...reservedFileNamesInIDEconfig); 52 } 53 arkProjectConfig.obfuscationMergedObConfig = mergedObConfig; 54 55 arkProjectConfig.arkObfuscator = initArkGuardConfig( 56 projectConfig.obfuscationOptions?.obfuscationCacheDir, 57 logger, 58 mergedObConfig, 59 isHarCompiled, 60 ); 61} 62 63function initArkGuardConfig( 64 obfuscationCacheDir: string | undefined, 65 logger: any, 66 mergedObConfig: MergedConfig, 67 isHarCompiled: boolean, 68): ArkObfuscator { 69 const arkguardConfig: IOptions = { 70 mCompact: mergedObConfig.options.compact, 71 mDisableConsole: mergedObConfig.options.removeLog, 72 mSimplify: false, 73 mRemoveComments: true, 74 mNameObfuscation: { 75 mEnable: true, 76 mNameGeneratorType: 1, 77 mReservedNames: mergedObConfig.reservedNames, 78 mRenameProperties: mergedObConfig.options.enablePropertyObfuscation, 79 mReservedProperties: mergedObConfig.reservedPropertyNames, 80 mKeepStringProperty: !mergedObConfig.options.enableStringPropertyObfuscation, 81 mTopLevel: mergedObConfig.options.enableToplevelObfuscation, 82 mReservedToplevelNames: mergedObConfig.reservedGlobalNames, 83 mUniversalReservedProperties: mergedObConfig.universalReservedPropertyNames, 84 mUniversalReservedToplevelNames: mergedObConfig.universalReservedGlobalNames, 85 }, 86 mRemoveDeclarationComments: { 87 mEnable: mergedObConfig.options.removeComments, 88 mReservedComments: mergedObConfig.keepComments, 89 }, 90 mEnableSourceMap: true, 91 mEnableNameCache: true, 92 mRenameFileName: { 93 mEnable: mergedObConfig.options.enableFileNameObfuscation, 94 mNameGeneratorType: 1, 95 mReservedFileNames: mergedObConfig.reservedFileNames, 96 }, 97 mExportObfuscation: mergedObConfig.options.enableExportObfuscation, 98 mPerformancePrinter: printerConfig, 99 mKeepFileSourceCode: { 100 mKeepSourceOfPaths: new Set(), 101 mkeepFilesAndDependencies: new Set(), 102 }, 103 }; 104 105 const arkObfuscator: ArkObfuscator = new ArkObfuscator(); 106 arkObfuscator.init(arkguardConfig); 107 if (mergedObConfig.options.applyNameCache && mergedObConfig.options.applyNameCache.length > 0) { 108 readNameCache(mergedObConfig.options.applyNameCache, logger); 109 } else { 110 if (obfuscationCacheDir) { 111 const defaultNameCachePath: string = path.join(obfuscationCacheDir, 'nameCache.json'); 112 if (fs.existsSync(defaultNameCachePath)) { 113 readNameCache(defaultNameCachePath, logger); 114 } 115 } 116 } 117 return arkObfuscator; 118} 119