1 /* 2 * Copyright (c) 2021-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 16 #ifndef OHOS_ABILITY_RUNTIME_ABILITY_COMMAND_H 17 #define OHOS_ABILITY_RUNTIME_ABILITY_COMMAND_H 18 19 #include <regex> 20 21 #include "ability_manager_interface.h" 22 #include "shell_command.h" 23 24 namespace OHOS { 25 namespace AAFwk { 26 namespace { 27 using ParametersInteger = std::map<std::string, int>; 28 using ParametersString = std::map<std::string, std::string>; 29 using ParametersBool = std::map<std::string, bool>; 30 31 const std::string TOOL_NAME = "aa"; 32 33 // not show in command 34 // process -- debug ability with options 35 const std::string HELP_MSG = "usage: aa <command> <options>\n" 36 "These are common aa commands list:\n" 37 " help list available commands\n" 38 " start start ability with options\n" 39 " stop-service stop service with options\n" 40 " dump dump the ability info\n" 41 " force-stop <bundle-name> force stop the process with bundle name\n" 42 " attach attach application to enter debug mode\n" 43 " detach detach application to exit debug mode\n" 44 #ifdef ABILITY_COMMAND_FOR_TEST 45 " test start the test framework with options\n" 46 " ApplicationNotResponding Pass in pid with options\n" 47 #else 48 " test start the test framework with options\n" 49 " appdebug set / cancel / get waiting debug status\n" 50 " process debug and tune\n"; 51 #endif 52 53 const std::string HELP_ApplicationNotResponding = 54 "usage: aa ApplicationNotResponding <options>\n" 55 "options list:\n" 56 " -h, --help list available commands\n" 57 " -p, --pid Pass in pid with option\n"; 58 59 // not show in command 60 // [-N] [-p <perf-cmd>] 61 const std::string HELP_MSG_START = 62 "usage: aa start <options>\n" 63 "options list:\n" 64 " -h, --help list available commands\n" 65 " [-d <device-id>] [-a <ability-name> -b <bundle-name>] [-m <module-name>] [-p <perf-cmd>] [-D] [-E] [-S] [-N]" 66 " [-R] [--ps <key> <string-value>] " 67 " [--pi <key> <integer-value>] " 68 " [--pb <key> <boolean-value>] " 69 " [--psn <key>] " 70 " [-A <action-name>] " 71 " [-U <URI>] " 72 " [-e <entity>] " 73 " [-t <mime-type>] " 74 " [--wl <window-left>] " 75 " [--wt <window-top>] " 76 " [--wh <window-height>] " 77 " [--ww <window-width>] " 78 " start ability with an element name\n"; 79 80 const std::string HELP_MSG_STOP_SERVICE = 81 "usage: aa stop-service <options>\n" 82 "options list:\n" 83 " -h, --help list available commands\n" 84 " [-d <device-id>] -a <ability-name> -b <bundle-name> [-m <module-name>] " 85 " stop service with an element name\n"; 86 87 const std::string HELP_MSG_DUMPSYS = "usage: aa dump <options>\n" 88 "options list:\n" 89 " -h, --help list available commands\n" 90 " -a, --all dump all abilities\n" 91 " -l, --mission-list dump mission list\n" 92 " -i, --ability dump abilityRecordId\n" 93 " -e, --extension dump elementName (FA: serviceAbilityRecords," 94 "Stage: ExtensionRecords)\n" 95 " -p, --pending dump pendingWantRecordId\n" 96 " -r, --process dump process\n" 97 " -d, --data dump the data abilities\n" 98 " -u, --userId userId\n" 99 " -c, --client client\n" 100 " -c, -u are auxiliary parameters and cannot be used alone\n" 101 " The original -s parameter is invalid\n" 102 " The original -m parameter is invalid\n"; 103 104 const std::string HELP_MSG_PROCESS = "usage: aa process <options>\n" 105 "options list:\n" 106 " -h, --help list available commands\n" 107 " -a <ability-name> -b <bundle-name> [-m <module-name>]\n" 108 " -p <perf-cmd> performance optimization command. Either -p or -D must be selected, " 109 "-p takes precedence.\n" 110 " -D <debug-cmd> debug command. Either -p or -D must be selected, -p takes precedence.\n" 111 " [-S]\n" 112 " debug ability with an element name\n"; 113 114 const std::string HELP_MSG_TEST = 115 "usage: aa test <options>\n" 116 "options list:\n" 117 " -h, --help list available commands\n" 118 " -b <bundle-name> -s unittest <test-runner> start the test framework with options\n" 119 " [-p <package-name>] the name of package with test-runner, " 120 "required for the FA model\n" 121 " [-m <module-name>] the name of module with test-runner, " 122 "required for the STAGE model\n" 123 " [-s class <test-class>]\n" 124 " [-s level <test-level>]\n" 125 " [-s size <test-size>]\n" 126 " [-s testType <test-testType>]\n" 127 " [-s timeout <test-timeout>]\n" 128 " [-s <any-key> <any-value>]\n" 129 " [-w <wait-time>]\n" 130 " [-D]\n"; 131 132 const std::string HELP_MSG_ATTACH_APP_DEBUG = 133 "usage: aa attach <options>\n" 134 "options list:\n" 135 " -h, --help list available commands\n" 136 " -b <bundle-name> let application enter debug mode by bundle name\n"; 137 const std::string HELP_MSG_DETACH_APP_DEBUG = 138 "usage: aa detach <options>\n" 139 "options list:\n" 140 " -h, --help list available commands\n" 141 " -b <bundle-name> let application exit debug mode by bundle name\n"; 142 143 const std::string HELP_MSG_APPDEBUG_APP_DEBUG = 144 "usage: aa appdebug <options>\n" 145 "options list:\n" 146 " -h, --help list available commands\n" 147 " -b, --bundlename <bundle-name> let application set wait debug mode by bundle name with options\n" 148 " [-p, --persist] option: persist flag\n" 149 " -c, --cancel let application cancel wait debug\n" 150 " -g, --get get wait debug mode application bundle name and persist flag\n"; 151 152 const std::string HELP_MSG_FORCE_STOP = "usage: aa force-stop <bundle-name>\n"; 153 const std::string HELP_MSG_FORCE_TIMEOUT = 154 "usage: aa force-timeout <ability-name> <INITIAL|INACTIVE|COMMAND|FOREGROUND|BACKGROUND|TERMINATING>\n" 155 "usage: aa force-timeout clean."; 156 const std::string HELP_MSG_FORCE_TIMEOUT_CLEAN = "clean"; 157 158 const std::string HELP_MSG_NO_ABILITY_NAME_OPTION = "error: -a <ability-name> is expected"; 159 const std::string HELP_MSG_NO_BUNDLE_NAME_OPTION = "error: -b <bundle-name> is expected"; 160 161 const std::string STRING_START_ABILITY_OK = "start ability successfully."; 162 const std::string STRING_START_ABILITY_NG = "error: failed to start ability."; 163 164 const std::string STRING_STOP_SERVICE_ABILITY_OK = "stop service ability successfully."; 165 const std::string STRING_STOP_SERVICE_ABILITY_NG = "error: failed to stop service ability."; 166 167 const std::string STRING_FORCE_STOP_OK = "force stop process successfully."; 168 const std::string STRING_FORCE_STOP_NG = "error: failed to force stop process."; 169 170 const std::string STRING_ATTACH_APP_DEBUG_OK = "attach app debug successfully."; 171 const std::string STRING_ATTACH_APP_DEBUG_NG = "error: failed to attach app debug."; 172 173 const std::string STRING_DETACH_APP_DEBUG_OK = "detach app debug successfully."; 174 const std::string STRING_DETACH_APP_DEBUG_NG = "error: failed to detach app debug."; 175 176 const std::string STRING_START_USER_TEST_NG = "error: failed to start user test."; 177 const std::string STRING_USER_TEST_STARTED = "user test started."; 178 const std::string STRING_USER_TEST_FINISHED = "user test finished."; 179 180 const std::string STRING_BLOCK_AMS_SERVICE_OK = "block ams service successfully."; 181 const std::string STRING_BLOCK_AMS_SERVICE_NG = "error: failed to block ams service."; 182 183 const std::string STRING_APP_DEBUG_OK = "app debug successfully."; 184 const std::string STRING_APP_DEBUG_NG = "error: failed to app debug."; 185 186 const std::string STRING_START_NATIVE_PROCESS_OK = "start native process successfully."; 187 const std::string STRING_START_NATIVE_PROCESS_NG = "error: failed to start native process."; 188 189 const int USER_TEST_COMMAND_START_INDEX = 2; 190 const int USER_TEST_COMMAND_PARAMS_NUM = 2; 191 const int TIME_RATE_MS = 1000; 192 const std::string STRING_FORCE_TIMEOUT_OK = "force ability timeout successfully."; 193 const std::string STRING_FORCE_TIMEOUT_NG = "error: failed to force ability timeout."; 194 195 const int NUMBER_TWO = 2; 196 const int NUMBER_ONE = 1; 197 198 const std::string DEBUG_VALUE = "true"; 199 200 const std::string PERFCMD_FIRST_PROFILE = "profile"; 201 const std::string PERFCMD_FIRST_DUMPHEAP = "dumpheap"; 202 203 const std::string STRING_TEST_REGEX_INTEGER_NUMBERS = "^(0|[1-9][0-9]*|-[1-9][0-9]*)$"; 204 const std::string STRING_REGEX_ALL_NUMBERS = "^(-)?([0-9]|[1-9][0-9]+)([\\.][0-9]+)?$"; 205 } // namespace 206 207 class AbilityManagerShellCommand : public ShellCommand { 208 public: 209 AbilityManagerShellCommand(int argc, char* argv[]); ~AbilityManagerShellCommand()210 ~AbilityManagerShellCommand() override 211 {} 212 213 ErrCode CreateMessageMap() override; 214 bool IsTestCommandIntegrity(const std::map<std::string, std::string>& params); 215 ErrCode StartUserTest(const std::map<std::string, std::string>& params); 216 217 private: 218 ErrCode CreateCommandMap() override; 219 ErrCode init() override; 220 221 ErrCode RunAsHelpCommand(); 222 ErrCode RunAsStartAbility(); 223 ErrCode RunAsStopService(); 224 ErrCode RunAsDumpsysCommand(); 225 ErrCode RunAsForceStop(); 226 bool SwitchOptionForAppDebug(int32_t option, std::string &bundleName, bool &isPersist, bool &isCancel, bool &isGet); 227 bool ParseAppDebugParameter(std::string &bundleName, bool &isPersist, bool &isCancel, bool &isGet); 228 ErrCode RunAsAppDebugDebugCommand(); 229 ErrCode RunAsProcessCommand(); 230 ErrCode RunAsAttachDebugCommand(); 231 ErrCode RunAsDetachDebugCommand(); 232 bool CheckParameters(int target); 233 ErrCode ParseParam(ParametersInteger& pi); 234 ErrCode ParseParam(ParametersString& ps, bool isNull); 235 ErrCode ParseParam(ParametersBool& pb); 236 void SetParams(const ParametersInteger& pi, Want& want); 237 void SetParams(const ParametersString& ps, Want& want); 238 void SetParams(const ParametersBool& pb, Want& want); 239 Reason CovertExitReason(std::string& reasonStr); 240 pid_t ConvertPid(std::string& inputPid); 241 242 #ifdef ABILITY_COMMAND_FOR_TEST 243 ErrCode RunForceTimeoutForTest(); 244 ErrCode RunAsSendAppNotRespondingProcessID(); 245 ErrCode RunAsSendAppNotRespondingWithUnknownOption(); 246 ErrCode RunAsSendAppNotRespondingWithOption(int32_t option, std::string& pid); 247 #endif 248 #ifdef ABILITY_FAULT_AND_EXIT_TEST 249 ErrCode RunAsForceExitAppCommand(); 250 ErrCode RunAsNotifyAppFaultCommand(); 251 #endif 252 sptr<IAbilityManager> GetAbilityManagerService(); 253 254 ErrCode MakeWantFromCmd(Want& want, std::string& windowMode); 255 ErrCode MakeWantForProcess(Want& want); 256 ErrCode RunAsTestCommand(); 257 ErrCode TestCommandError(const std::string& info); 258 bool MatchOrderString(const std::regex &r, const std::string &orderCmd); 259 bool CheckPerfCmdString(const char* optarg, const size_t paramLength, std::string &perfCmd); 260 void ParseBundleName(std::string &bundleName); 261 }; 262 } // namespace AAFwk 263 } // namespace OHOS 264 265 #endif // OHOS_ABILITY_RUNTIME_ABILITY_COMMAND_H 266