1/* 2 * Copyright (c) 2022 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#include "wukong_util.h" 17 18#include <climits> 19#include <dirent.h> 20#include <fstream> 21#include <iostream> 22#include <memory.h> 23#include <sstream> 24#include <sys/stat.h> 25 26#include "ability_manager_client.h" 27#include "display_manager.h" 28#include "if_system_ability_manager.h" 29#include "iservice_registry.h" 30#include "launcher_service.h" 31#include "png.h" 32#include "string_ex.h" 33#include "system_ability_definition.h" 34#include "wukong_define.h" 35#include "bundle_mgr_proxy.h" 36#include "common.h" 37#include "accessibility_ui_test_ability.h" 38#include "component_manager.h" 39#include "dump_usage.h" 40 41namespace OHOS { 42namespace WuKong { 43namespace { 44const std::string DEFAULT_DIR = "/data/local/tmp/wukong/report/"; 45const uint32_t LAP_HEIGHT = 200; 46const uint32_t CHARGE_STRIDE = 11; 47const uint32_t BLANK_THR = 30; 48const uint32_t WHITE_THR = 225; 49int g_bwCount = 0; 50bool g_isBwScreen(std::shared_ptr<Media::PixelMap> pixelMap) 51{ 52 auto width = static_cast<uint32_t>(pixelMap->GetWidth()); 53 auto height = static_cast<uint32_t>(pixelMap->GetHeight()); 54 auto data = pixelMap->GetPixels(); 55 auto stride = static_cast<uint32_t>(pixelMap->GetRowBytes()); 56 bool isUpper = true; 57 bool isLower = true; 58 uint32_t heightLimit = height - LAP_HEIGHT; 59 for (uint32_t i = LAP_HEIGHT; i < heightLimit && (isUpper || isLower); i += CHARGE_STRIDE) { 60 for (uint32_t j = 0; j < width; j += 1) { 61 auto pixel = *(data + (i * stride) + (j * 4)); 62 if (pixel >= BLANK_THR) { 63 isLower = false; 64 } 65 if (pixel <= WHITE_THR) { 66 isUpper = false; 67 } 68 if (!isLower && !isUpper) { 69 break; 70 } 71 } 72 } 73 return isLower || isUpper; 74} 75 76bool TakeWuKongScreenCap(const std::string &wkScreenPath, const bool checkBWScreen = false) 77{ 78 // get PixelMap from DisplayManager API 79 Rosen::DisplayManager &displayMgr = Rosen::DisplayManager::GetInstance(); 80 std::shared_ptr<Media::PixelMap> pixelMap = displayMgr.GetScreenshot(displayMgr.GetDefaultDisplayId()); 81 static constexpr int bitmapDepth = 8; 82 if (pixelMap == nullptr) { 83 DEBUG_LOG("Failed to get display pixelMap"); 84 return false; 85 } 86 auto width = static_cast<uint32_t>(pixelMap->GetWidth()); 87 auto height = static_cast<uint32_t>(pixelMap->GetHeight()); 88 auto data = pixelMap->GetPixels(); 89 auto stride = static_cast<uint32_t>(pixelMap->GetRowBytes()); 90 if (checkBWScreen) { 91 bool result = g_isBwScreen(pixelMap); 92 if (result) { 93 g_bwCount++; 94 INFO_LOG_STR("isBWScreen is true, BWScreen count : %d", g_bwCount); 95 } 96 } 97 png_structp pngStruct = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); 98 if (pngStruct == nullptr) { 99 DEBUG_LOG("error: png_create_write_struct nullptr!"); 100 return false; 101 } 102 png_infop pngInfo = png_create_info_struct(pngStruct); 103 if (pngInfo == nullptr) { 104 DEBUG_LOG("error: png_create_info_struct error nullptr!"); 105 png_destroy_write_struct(&pngStruct, nullptr); 106 return false; 107 } 108 FILE *fp = fopen(wkScreenPath.c_str(), "wb"); 109 if (fp == nullptr) { 110 ERROR_LOG("error: open file error!"); 111 png_destroy_write_struct(&pngStruct, &pngInfo); 112 return false; 113 } 114 png_init_io(pngStruct, fp); 115 png_set_IHDR(pngStruct, pngInfo, width, height, bitmapDepth, PNG_COLOR_TYPE_RGBA, PNG_INTERLACE_NONE, 116 PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); 117 png_set_packing(pngStruct); // set packing info 118 png_write_info(pngStruct, pngInfo); // write to header 119 for (uint32_t i = 0; i < height; i++) { 120 png_write_row(pngStruct, data + (i * stride)); 121 } 122 png_write_end(pngStruct, pngInfo); 123 // free 124 png_destroy_write_struct(&pngStruct, &pngInfo); 125 (void)fclose(fp); 126 return true; 127} 128} // namespace 129using namespace std; 130using namespace OHOS::AppExecFwk; 131const int USE_ID = 100; 132WuKongUtil::WuKongUtil() 133{ 134 TRACK_LOG_STD(); 135 const int timeBufsize = 32; 136 char fileNameBuf[timeBufsize] = {0}; 137 time_t currentTime = time(0); 138 uint32_t res = 0; 139 140 if (currentTime > 0) { 141 tm *timePtr = localtime(¤tTime); 142 if (timePtr == nullptr) { 143 ERROR_LOG("timePtr is nullptr"); 144 return; 145 } 146 res = strftime(fileNameBuf, timeBufsize, "%Y%m%d_%H%M%S", timePtr); 147 } 148 if (res > 0) { 149 startRunTime_ = std::string(fileNameBuf); 150 } else { 151 startRunTime_ = "unvalid_time"; 152 } 153 curDir_ = DEFAULT_DIR + startRunTime_ + "/"; 154 DEBUG_LOG_STR("common dir{%s}", curDir_.c_str()); 155 DIR *rootDir = nullptr; 156 std::string dirStr = "/"; 157 std::vector<std::string> strs; 158 OHOS::SplitStr(curDir_, "/", strs); 159 for (auto str : strs) { 160 dirStr.append(str); 161 dirStr.append("/"); 162 if ((rootDir = opendir(dirStr.c_str())) == nullptr) { 163 int ret = mkdir(dirStr.c_str(), S_IROTH | S_IRWXU | S_IRWXG); 164 if (ret != 0 && dirStr != "/data/" && dirStr != "/data/local/") { 165 std::cerr << "failed to create dir: " << dirStr << std::endl; 166 break; 167 } 168 } else { 169 closedir(rootDir); 170 } 171 } 172 DEBUG_LOG_STR("%s", startRunTime_.c_str()); 173 TRACK_LOG_END(); 174} 175 176/** 177 * @brief: release util 178 */ 179WuKongUtil::~WuKongUtil() 180{ 181 TRACK_LOG_STD(); 182} 183 184ErrCode WuKongUtil::GetAllAppInfo() 185{ 186 AppExecFwk::LauncherService launcherservice; 187 std::vector<AppExecFwk::LauncherAbilityInfo> launcherAbilityInfos(0); 188 189 bool result = launcherservice.GetAllLauncherAbilityInfos(USE_ID, launcherAbilityInfos); 190 DEBUG_LOG_STR("GetAllLauncherAbilityInfos: size (%u), result (%d)", launcherAbilityInfos.size(), result); 191 if (launcherAbilityInfos.size() == 0) { 192 ERROR_LOG("GetAllLauncherAbilityInfos size is 0"); 193 return OHOS::ERR_INVALID_VALUE; 194 } 195 for (auto item : launcherAbilityInfos) { 196 iconPath_ = item.applicationInfo.iconPath; 197 DEBUG_LOG_STR("iconPath: %s", item.applicationInfo.iconPath.c_str()); 198 DEBUG_LOG_STR("codePath: %s", item.applicationInfo.codePath.c_str()); 199 DEBUG_LOG_STR("dataDir: %s", item.applicationInfo.dataDir.c_str()); 200 DEBUG_LOG_STR("dataBaseDir: %s", item.applicationInfo.dataBaseDir.c_str()); 201 DEBUG_LOG_STR("cacheDir: %s", item.applicationInfo.cacheDir.c_str()); 202 DEBUG_LOG_STR("entryDir: %s", item.applicationInfo.entryDir.c_str()); 203 std::string bundleName = item.elementName.GetBundleName(); 204 // store the list of all bundle names 205 bundleList_.push_back(bundleName); 206 abilityList_.push_back(item.elementName.GetAbilityName()); 207 uint32_t isInBlockList = FindElement(blockList_, bundleName); 208 if (isInBlockList != INVALIDVALUE) { 209 continue; 210 } 211 // store the list of bundle names except for block list 212 validBundleList_.push_back(bundleName); 213 validAbilityList_.push_back(item.elementName.GetAbilityName()); 214 } 215 GetAllAbilities(); 216 return OHOS::ERR_OK; 217} 218 219void WuKongUtil::GetBundleList(std::vector<std::string> &bundlelist, std::vector<std::string> &abilitylist) 220{ 221 if (bundleList_.size() == 0) { 222 GetAllAppInfo(); 223 } 224 bundlelist = bundleList_; 225 abilitylist = abilityList_; 226} 227 228uint32_t WuKongUtil::FindElement(std::vector<std::string> &bundleList, std::string key) 229{ 230 auto it = find(bundleList.begin(), bundleList.end(), key); 231 if (it != bundleList.end()) { 232 return distance(bundleList.begin(), it); 233 } 234 return INVALIDVALUE; 235} 236 237bool WuKongUtil::ContainsElement(std::vector<std::string> &bundleList, std::string key) 238{ 239 return INVALIDVALUE != FindElement(bundleList, key); 240} 241 242ErrCode WuKongUtil::CheckBundleNameList() 243{ 244 std::set<std::string> m(allowList_.begin(), allowList_.end()); 245 246 for (auto it = blockList_.begin(); it != blockList_.end(); it++) { 247 if (m.find(*it) != m.end()) { 248 ERROR_LOG("invalid param:please check params of '-p' and '-b'"); 249 return OHOS::ERR_INVALID_VALUE; 250 } 251 } 252 return OHOS::ERR_OK; 253} 254 255ErrCode WuKongUtil::CheckArgumentList(std::vector<std::string> &arguments, bool isAddToList) 256{ 257 ErrCode result = OHOS::ERR_OK; 258 GetAllAppInfo(); 259 for (uint32_t i = 0; i < arguments.size(); i++) { 260 uint32_t index = FindElement(bundleList_, arguments[i]); 261 if (index == INVALIDVALUE) { 262 uint32_t unLaunchedIndex = FindElement(unLaunchedBundleList_, arguments[i]); 263 if (unLaunchedIndex == INVALIDVALUE) { 264 ERROR_LOG_STR("bundle name '%s' is not be included in all bundles", arguments[i].c_str()); 265 result = OHOS::ERR_INVALID_VALUE; 266 } else if (isAddToList) { 267 bundleList_.push_back(arguments[i]); 268 abilityList_.push_back(unLaunchedAbilityList_[unLaunchedIndex]); 269 } 270 } 271 } 272 return result; 273} 274 275ErrCode WuKongUtil::SetAllowList(const std::string &optarg) 276{ 277 SplitStr(optarg, ",", allowList_); 278 ErrCode result = CheckArgumentList(allowList_, true); 279 if (result == OHOS::ERR_OK) { 280 // delete repeat argument 281 DelRepeatArguments(allowList_); 282 if (allowList_.size() > 0) { 283 result = CheckBundleNameList(); 284 } 285 } 286 return result; 287} 288 289ErrCode WuKongUtil::CheckAbilityArgumentList(std::vector<std::string> &arguments) 290{ 291 ErrCode result = OHOS::ERR_OK; 292 GetAllAppInfo(); 293 for (uint32_t i = 0; i < arguments.size(); i++) { 294 uint32_t index = FindElement(allAbilityList_, arguments[i]); 295 if (index == INVALIDVALUE) { 296 ERROR_LOG_STR("Ability name '%s' is not be included in all abilities", arguments[i].c_str()); 297 result = OHOS::ERR_INVALID_VALUE; 298 } 299 } 300 return result; 301} 302 303ErrCode WuKongUtil::SetAllowAbilityList(const std::string &optarg) 304{ 305 SplitStr(optarg, ",", allowAbilityList_); 306 ErrCode result = CheckAbilityArgumentList(allowAbilityList_); 307 if (result == OHOS::ERR_OK) { 308 // delete repeat argument 309 DelRepeatArguments(allowAbilityList_); 310 if (allowAbilityList_.size() > 0) { 311 result = CheckAbilityNameList(); 312 } 313 } 314 return result; 315} 316 317ErrCode WuKongUtil::SetBlockAbilityList(const std::string &optarg) 318{ 319 SplitStr(optarg, ",", blockAbilityList_); 320 ErrCode result = CheckAbilityArgumentList(blockAbilityList_); 321 if (result == OHOS::ERR_OK) { 322 // delete repeat argument 323 DelRepeatArguments(blockAbilityList_); 324 if (blockAbilityList_.size() > 0) { 325 result = CheckAbilityNameList(); 326 } 327 } 328 return result; 329} 330 331ErrCode WuKongUtil::CheckAbilityNameList() 332{ 333 std::set<std::string> m(allowAbilityList_.begin(), allowAbilityList_.end()); 334 335 for (auto it = blockAbilityList_.begin(); it != blockAbilityList_.end(); it++) { 336 if (m.find(*it) != m.end()) { 337 ERROR_LOG("invalid param:please check params of '-e' and '-E'"); 338 return OHOS::ERR_INVALID_VALUE; 339 } 340 } 341 return OHOS::ERR_OK; 342} 343 344ErrCode WuKongUtil::SetBlockList(const std::string &optarg) 345{ 346 SplitStr(optarg, ",", blockList_); 347 ErrCode result = CheckArgumentList(blockList_, false); 348 if (result == OHOS::ERR_OK) { 349 // delete repeat argument 350 DelRepeatArguments(blockList_); 351 if (blockList_.size() > 0) { 352 result = CheckBundleNameList(); 353 } 354 } 355 return result; 356} 357 358ErrCode WuKongUtil::SetBlockPageList(const std::string &optarg) 359{ 360 ErrCode result = OHOS::ERR_OK; 361 std::vector<std::string> temp; 362 SplitStr(optarg, ",", temp); 363 blockPageList_.insert(blockPageList_.end(), temp.begin(), temp.end()); 364 // delete repeat argument 365 DelRepeatArguments(blockPageList_); 366 if (blockPageList_.size() > 0) { 367 stringstream ss; 368 for (const auto& str:blockPageList_) { 369 ss << str << " "; 370 } 371 INFO_LOG_STR("Please confirm that the blocked page is %s", ss.str().c_str()); 372 result = OHOS::ERR_OK; 373 } 374 return result; 375} 376 377ErrCode WuKongUtil::SetComponentUri(const std::string &optarg) 378{ 379 uri_ = optarg; 380 ErrCode result; 381 if (!uri_.empty()) { 382 result = OHOS::ERR_OK; 383 INFO_LOG_STR("Set component Uri is %s", uri_.c_str()); 384 } else { 385 result = OHOS::ERR_INVALID_VALUE; 386 ERROR_LOG("Set component Uri is failed, please check -U param"); 387 } 388 return result; 389} 390 391ErrCode WuKongUtil::SetComponentUriType(const std::string &optarg) 392{ 393 uriType_ = optarg; 394 ErrCode result; 395 if (!uriType_.empty()) { 396 result = OHOS::ERR_OK; 397 INFO_LOG_STR("Set component Uri Type is %s", uriType_.c_str()); 398 } else { 399 result = OHOS::ERR_INVALID_VALUE; 400 ERROR_LOG("Set component Uri Type is failed, please check -x param"); 401 } 402 return result; 403} 404 405std::string WuKongUtil::GetComponentUri() 406{ 407 return uri_; 408} 409 410std::string WuKongUtil::GetComponentUriType() 411{ 412 return uriType_; 413} 414 415void WuKongUtil::DelRepeatArguments(std::vector<std::string> &argumentlist) 416{ 417 std::set<std::string> s(argumentlist.begin(), argumentlist.end()); 418 argumentlist.assign(s.begin(), s.end()); 419} 420 421void WuKongUtil::GetAllowList(std::vector<std::string> &allowList) 422{ 423 allowList = allowList_; 424} 425 426void WuKongUtil::GetAllowAbilityList(std::vector<std::string> &allowAbilityList) 427{ 428 allowAbilityList = allowAbilityList_; 429} 430 431void WuKongUtil::GetBlockList(std::vector<std::string> &blockList) 432{ 433 blockList = blockList_; 434} 435 436void WuKongUtil::GetBlockAbilityList(std::vector<std::string> &blockAbilityList) 437{ 438 blockAbilityList = blockAbilityList_; 439} 440 441void WuKongUtil::GetBlockPageList(std::vector<std::string> &blockPageList) 442{ 443 blockPageList = blockPageList_; 444} 445 446void WuKongUtil::GetValidBundleList(std::vector<std::string> &validbundlelist) 447{ 448 validbundlelist = validBundleList_; 449} 450 451void WuKongUtil::SetAllAppInfo(std::vector<std::string> &bundleList, std::vector<std::string> &abilityList) 452{ 453 bundleList_ = bundleList; 454 abilityList_ = abilityList; 455} 456 457void WuKongUtil::SetTempAllowList(std::vector<std::string> tempAllowList) 458{ 459 tempAllowList_ = tempAllowList; 460} 461 462std::vector<std::string> WuKongUtil::GetTempAllowList() 463{ 464 return tempAllowList_; 465} 466 467void WuKongUtil::SetOrderFlag(bool orderFlag) 468{ 469 orderFlag_ = orderFlag; 470} 471 472bool WuKongUtil::GetOrderFlag() 473{ 474 return orderFlag_; 475} 476 477ErrCode WuKongUtil::GetScreenSize(int32_t &width, int32_t &height) 478{ 479 ErrCode result = OHOS::ERR_OK; 480 if (screenWidth_ == -1 || screenHeight_ == -1) { 481 OHOS::Rosen::DisplayManager &displayMgr = OHOS::Rosen::DisplayManager::GetInstance(); 482 sptr<OHOS::Rosen::Display> display = displayMgr.GetDefaultDisplay(); 483 if (display == nullptr) { 484 ERROR_LOG("get screen size failed"); 485 return OHOS::ERR_NO_INIT; 486 } 487 screenWidth_ = display->GetWidth(); 488 screenHeight_ = display->GetHeight(); 489 } 490 width = screenWidth_; 491 height = screenHeight_; 492 return result; 493} 494 495void WuKongUtil::GetIconPath(std::string &iconpath) 496{ 497 iconpath = iconPath_; 498} 499 500ErrCode WuKongUtil::WukongScreenCap(std::string &screenStorePath, bool gCommandUitest, bool g_commandCHECKBWSCREEN) 501{ 502 using namespace std::chrono; 503 ErrCode result = ERR_OK; 504 auto wukongts = to_string(time_point_cast<milliseconds>(system_clock::now()).time_since_epoch().count()); 505 int fileExist_ = access((curDir_ + "screenshot").c_str(), F_OK); 506 if (fileExist_ == 0) { 507 DEBUG_LOG("File exist."); 508 } else { 509 const int wukongScreenShot = mkdir((curDir_ + "screenshot").c_str(), 0777); 510 DEBUG_LOG("File create."); 511 if (wukongScreenShot == -1) { 512 DEBUG_LOG("Error creating directory!"); 513 result = ERR_NO_INIT; 514 } 515 } 516 auto wkScreenPath = curDir_ + "screenshot/" + "/" + wukongts + ".png"; 517 DEBUG_LOG_STR("WukongScreenCap store path is {%s}", wkScreenPath.c_str()); 518 if (gCommandUitest) { 519 auto cm = ComponentManager::GetInstance(); 520 auto auita = Accessibility::AccessibilityUITestAbility::GetInstance(); 521 auita->Disconnect(); 522 std::string uitestCmd = "uitest dumpLayout -i -p " + curDir_ + "screenshot" + "/" + wukongts + ".json"; 523 std::string res = Common::runProcess(uitestCmd); 524 DEBUG_LOG_STR("unitestCmd : %s", res.c_str()); 525 cm->Disconnect(); 526 if (!cm->Connect()) { 527 ERROR_LOG("ComponentManager Connect failed"); 528 return OHOS::ERR_INVALID_OPERATION; 529 } 530 } 531 bool isTakeScreen = TakeWuKongScreenCap(wkScreenPath, g_commandCHECKBWSCREEN); 532 if (isTakeScreen == true) { 533 screenStorePath = wkScreenPath; 534 DEBUG_LOG("The snapshot has been created."); 535 } else { 536 DEBUG_LOG("This snapshot can not be created."); 537 } 538 return result; 539} 540 541sptr<IBundleMgr> WuKongUtil::GetBundleMgrProxy() const 542{ 543 sptr<ISystemAbilityManager> systemAbilityManager = 544 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); 545 if (!systemAbilityManager) { 546 ERROR_LOG("failed to get system ability mgr."); 547 return nullptr; 548 } 549 550 sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); 551 if (!remoteObject) { 552 ERROR_LOG("failed to get bundle manager proxy."); 553 return nullptr; 554 } 555 556 return iface_cast<IBundleMgr>(remoteObject); 557} 558 559void WuKongUtil::GetAllAbilitiesByBundleName(std::string bundleName, std::vector<std::string> &abilities) 560{ 561 TRACK_LOG_STD(); 562 sptr<IBundleMgr> bundleMgrProxy = GetBundleMgrProxy(); 563 std::vector<BundleInfo> bundleInfos; 564 if (!bundleMgrProxy) { 565 ERROR_LOG("bundleMgrProxy is nullptr"); 566 return; 567 } 568 bool getInfoResult = bundleMgrProxy->GetBundleInfos(BundleFlag::GET_BUNDLE_DEFAULT, bundleInfos, USE_ID); 569 if (!getInfoResult) { 570 ERROR_LOG("GetBundleInfos ERR"); 571 return; 572 } 573 DEBUG_LOG_STR("bundles length{%d}", bundleInfos.size()); 574 for (const auto &bundleIter : bundleInfos) { 575 TRACK_LOG_STR("bundleIter.name{%s}", bundleIter.name.c_str()); 576 BundleInfo bundleInfo; 577 if (bundleIter.name == bundleName) { 578 TRACK_LOG_STR("map bundleName{%s}", bundleIter.name.c_str()); 579 bool result = 580 bundleMgrProxy->GetBundleInfo(bundleIter.name, BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, 100); 581 if (!result) { 582 ERROR_LOG_STR("WriteBundleInfo getBundleInfo result %d, bundleName: %s", result, 583 bundleIter.name.c_str()); 584 break; 585 } 586 for (auto &abilityIter : bundleInfo.abilityInfos) { 587 TRACK_LOG_STR("bundleName{%s} container abilities item{%s}", bundleIter.name.c_str(), 588 (abilityIter.name).c_str()); 589 abilities.push_back(abilityIter.name); 590 } 591 } 592 } 593 TRACK_LOG_END(); 594} 595 596ErrCode WuKongUtil::GetAllAbilities() 597{ 598 TRACK_LOG_STD(); 599 ErrCode result = OHOS::ERR_INVALID_VALUE; 600 sptr<IBundleMgr> bundleMgrProxy = GetBundleMgrProxy(); 601 std::vector<BundleInfo> bundleInfos; 602 if (!bundleMgrProxy) { 603 ERROR_LOG("bundleMgrProxy is nullptr"); 604 return result; 605 } 606 bool getInfoResult = bundleMgrProxy->GetBundleInfos(BundleFlag::GET_BUNDLE_DEFAULT, bundleInfos, USE_ID); 607 if (!getInfoResult) { 608 ERROR_LOG("GetBundleInfos ERR"); 609 return result; 610 } 611 DEBUG_LOG_STR("bundles length{%d}", bundleInfos.size()); 612 for (const auto &bundleIter : bundleInfos) { 613 std::string bundleName = bundleIter.name; 614 uint32_t bundleListIndex = FindElement(bundleList_, bundleName); 615 BundleInfo bundleInfo; 616 bool getBundleResult = 617 bundleMgrProxy->GetBundleInfo(bundleName, BundleFlag::GET_BUNDLE_WITH_ABILITIES, bundleInfo, 100); 618 if (!getBundleResult) { 619 ERROR_LOG_STR("WriteWuKongBundleInfo getBundleInfo result %d", getBundleResult); 620 continue; 621 } 622 if (bundleListIndex != INVALIDVALUE) { 623 for (auto &abilityIter : bundleInfo.abilityInfos) { 624 allBundleList_.push_back(bundleName); 625 allAbilityList_.push_back(abilityIter.name); 626 DEBUG_LOG_STR("bundleName: %s, abilityName: %s", bundleName.c_str(), abilityIter.name.c_str()); 627 } 628 } else { 629 for (auto &abilityIter : bundleInfo.abilityInfos) { 630 unLaunchedBundleList_.push_back(bundleName); 631 unLaunchedAbilityList_.push_back(abilityIter.name); 632 allBundleList_.push_back(bundleName); 633 allAbilityList_.push_back(abilityIter.name); 634 DEBUG_LOG_STR("bundleName: %s, abilityName: %s", bundleName.c_str(), abilityIter.name.c_str()); 635 } 636 } 637 } 638 if (unLaunchedAbilityList_.size() > 0) { 639 result = OHOS::ERR_OK; 640 } 641 TRACK_LOG_END(); 642 return result; 643} 644 645std::string WuKongUtil::GetCurrentTestDir() 646{ 647 return curDir_; 648} 649 650bool WuKongUtil::CopyFile(std::string &targetFile, std::string &sourceDir, std::string &destDir) 651{ 652 std::ifstream in; 653 std::ofstream out; 654 DEBUG_LOG_STR("targetFile{%s} sourceDir{%s} destDir{%s}", targetFile.c_str(), sourceDir.c_str(), destDir.c_str()); 655 char filepathSource[PATH_MAX] = {'\0'}; 656 std::string sourceFile = sourceDir + targetFile; 657 char *realPathSource = realpath(sourceFile.c_str(), filepathSource); 658 if (realPathSource == nullptr) { 659 ERROR_LOG_STR("failed to get source file path (%s), errno: (%d)", sourceFile.c_str(), errno); 660 return false; 661 } 662 in.open(filepathSource, std::ios::binary); 663 if (in.fail()) { 664 std::cout << "Error 1: Fail to open the source file." << std::endl; 665 in.close(); 666 out.close(); 667 return false; 668 } 669 670 char filepathDest[PATH_MAX] = {'\0'}; 671 char *realPathDest = realpath(destDir.c_str(), filepathDest); 672 if (realPathDest == nullptr) { 673 ERROR_LOG_STR("failed to get dest dir path (%s), errno: (%d)", destDir.c_str(), errno); 674 return false; 675 } 676 DEBUG_LOG_STR("destDir{%s}", filepathDest); 677 std::string destFile = destDir + targetFile; 678 out.open(destFile.c_str(), std::ios::binary); 679 if (out.fail()) { 680 std::cout << "Error 2: Fail to create the new file." << std::endl; 681 out.close(); 682 in.close(); 683 return false; 684 } 685 out << in.rdbuf(); 686 out.close(); 687 in.close(); 688 return true; 689} 690 691bool WuKongUtil::DeleteFile(std::string targetDir) 692{ 693 DIR *dirdp = nullptr; 694 char filepathSource[PATH_MAX] = {'\0'}; 695 char *realPathSource = realpath(targetDir.c_str(), filepathSource); 696 if (realPathSource != nullptr) { 697 struct dirent *dp; 698 dirdp = opendir(targetDir.c_str()); 699 while ((dp = readdir(dirdp)) != NULL) { 700 std::string currentFileName(dp->d_name); 701 std::string sourceFile = targetDir + currentFileName; 702 char *realFileSource = realpath(sourceFile.c_str(), filepathSource); 703 if (realFileSource != nullptr) { 704 remove(sourceFile.c_str()); 705 } 706 } 707 } else { 708 return false; 709 } 710 (void)closedir(dirdp); 711 return true; 712} 713 714void WuKongUtil::SetCompIdBlockList(const std::string &optarg) 715{ 716 SplitStr(optarg, ",", compIdBlockList_); 717} 718 719std::vector<std::string> WuKongUtil::GetCompIdBlockList() 720{ 721 return compIdBlockList_; 722} 723 724void WuKongUtil::SetCompTypeBlockList(const std::string &optarg) 725{ 726 SplitStr(optarg, ",", compTypeBlockList_); 727} 728 729std::vector<std::string> WuKongUtil::GetCompTypeBlockList() 730{ 731 return compTypeBlockList_; 732} 733 734std::string WuKongUtil::runProcess(std::string cmd) 735{ 736 const unsigned int NUMBER_SIZE = 1024; 737 if (FILE* fp = popen(cmd.c_str(), "r")) { 738 std::ostringstream ostrStream; 739 char line[NUMBER_SIZE]; 740 while (fgets(line, NUMBER_SIZE, fp)) { 741 ostrStream << line; 742 } 743 pclose(fp); 744 return ostrStream.str(); 745 } else { 746 ERROR_LOG("popen function failed"); 747 } 748 return ""; 749} 750void WuKongUtil::SetIsFirstStartAppFlag(bool isFirstStartApp) 751{ 752 isFirstStartApp_ = isFirstStartApp; 753} 754bool WuKongUtil::GetIsFirstStartAppFlag() 755{ 756 return isFirstStartApp_; 757} 758std::string WuKongUtil::GetBundlePid() 759{ 760 auto elementName = OHOS::AAFwk::AbilityManagerClient::GetInstance()->GetTopAbility(); 761 std::string curBundleName = elementName.GetBundleName(); 762 std::string bufCmd = "pidof " + curBundleName; 763 FILE* fp = nullptr; 764 fp = popen(bufCmd.c_str(), "r"); 765 TRACK_LOG_STR("Run %s", bufCmd.c_str()); 766 if (fp == nullptr) { 767 ERROR_LOG("popen function failed"); 768 return ""; 769 } 770 const int bufferSize = 32; 771 char pid[bufferSize] = {0}; 772 if (fgets(pid, bufferSize - 1, fp) != nullptr) { 773 std::string pidStr(pid); 774 pidStr = OHOS::ReplaceStr(pidStr, "\n", " "); 775 pclose(fp); 776 return pidStr; 777 } 778 pclose(fp); 779 return ""; 780} 781 782uint64_t WuKongUtil::GetBundlePssTotal() 783{ 784 OHOS::HiviewDFX::DumpUsage dumpUsage; 785 std::string pidStr = GetBundlePid(); 786 int pid = std::stoi(pidStr); 787 OHOS::HiviewDFX::MemInfoData::MemInfo memInfo; 788 bool success = dumpUsage.GetMemInfo(pid, memInfo); 789 if (success) { 790 uint64_t pss = dumpUsage.GetPss(pid); 791 DEBUG_LOG_STR("Get bundle PssTotal is %d", pss); 792 return pss; 793 } 794 return 0; 795} 796 797} // namespace WuKong 798} // namespace OHOS 799