1 /* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. 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 APP_START_FILTER_H 17 #define APP_START_FILTER_H 18 19 #include <cstdint> 20 #include <vector> 21 #include "filter_base.h" 22 #include "string_help.h" 23 #include "trace_data_cache.h" 24 #include "trace_streamer_filters.h" 25 #include "ts_common.h" 26 #include "config_filter.h" 27 28 namespace SysTuning { 29 namespace TraceStreamer { 30 using namespace SysTuning::base; 31 enum StartupApp { 32 PROCESS_TOUCH = 0, 33 START_UI_ABILITY_BY_SCB, 34 LOAD_ABILITY, 35 APPLICATION_LAUNCHING, 36 UI_ABILITY_LAUNCHING, 37 UI_ABILITY_ONFOREGROUND, 38 FIRST_FRAME_APP_PHASE, 39 FIRST_FRAME_RENDER_PHASE 40 }; 41 class APPStartupData { 42 public: APPStartupData(uint32_t callid,uint32_t ipid,uint32_t tid,uint64_t startTime,uint64_t endTime)43 APPStartupData(uint32_t callid, uint32_t ipid, uint32_t tid, uint64_t startTime, uint64_t endTime) 44 : callid_(callid), ipid_(ipid), tid_(tid), startTime_(startTime), endTime_(endTime) 45 { 46 } 47 uint32_t callid_; 48 uint32_t ipid_; 49 uint32_t tid_; 50 uint64_t startTime_; 51 uint64_t endTime_; 52 }; 53 54 class APPStartupFilter : private FilterBase { 55 public: 56 APPStartupFilter(TraceDataCache *dataCache, const TraceStreamerFilters *filter); 57 APPStartupFilter(const APPStartupFilter &) = delete; 58 APPStartupFilter &operator=(const APPStartupFilter &) = delete; 59 ~APPStartupFilter() override; 60 void FilterAllAPPStartupData(); 61 62 private: 63 using appMap = std::unordered_map<DataIndex, std::map<uint32_t, std::unique_ptr<APPStartupData>>>; 64 void ParserSoInitalization(); 65 void CalcDepthByTimeStamp(std::map<uint32_t, std::map<uint64_t, uint32_t>>::iterator it, 66 uint32_t &depth, 67 uint64_t endTime, 68 uint64_t startTime); 69 void ParserAppStartup(); 70 void UpdatePidByNameIndex(const appMap &mAPPStartupData); 71 bool CaclRsDataByPid(appMap &mAPPStartupData); 72 void AppenAllData(const appMap &mAPPStartupData); 73 void AppendAssociatedData(DataIndex packedNameIndex, 74 const std::map<uint32_t, std::unique_ptr<APPStartupData>> &stagesData); 75 bool UpdateAPPStartupData(uint32_t row, const std::string &nameString, uint32_t startIndex); 76 bool ProcAbilityLaunchData(const std::string &nameString, uint64_t raw); 77 void ProcForegroundData(uint64_t raw); 78 79 private: 80 std::deque<std::unique_ptr<APPStartupData>> procTouchItems_; 81 std::deque<std::unique_ptr<APPStartupData>> startUIAbilityBySCBItems_; 82 std::deque<std::unique_ptr<APPStartupData>> loadAbilityItems_; 83 appMap mAPPStartupData_; 84 std::map<uint32_t, appMap> mAPPStartupDataWithPid_; 85 const std::string dlopenCmd_ = "dlopen:"; 86 }; 87 } // namespace TraceStreamer 88 } // namespace SysTuning 89 90 #endif // APP_START_FILTER_H 91