xref: /aosp_15_r20/external/perfetto/src/trace_processor/importers/common/deobfuscation_mapping_table.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
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  */
16 
17 #include "src/trace_processor/importers/common/deobfuscation_mapping_table.h"
18 #include "perfetto/ext/base/string_utils.h"
19 #include "perfetto/ext/base/string_view.h"
20 
21 namespace perfetto {
22 namespace trace_processor {
23 
AddClassTranslation(const PackageId & package,StringId obfuscated_class_name,StringId deobfuscated_class_name,base::FlatHashMap<StringId,StringId> obfuscated_to_deobfuscated_members)24 bool DeobfuscationMappingTable::AddClassTranslation(
25     const PackageId& package,
26     StringId obfuscated_class_name,
27     StringId deobfuscated_class_name,
28     base::FlatHashMap<StringId, StringId> obfuscated_to_deobfuscated_members) {
29   if (PERFETTO_UNLIKELY(!default_package_id_)) {
30     default_package_id_ = package;
31   }
32 
33   ObfuscatedClassesToMembers& classes_to_members =
34       class_per_package_translation_[package];
35   return classes_to_members
36       .Insert(obfuscated_class_name,
37               ClassTranslation{deobfuscated_class_name,
38                                std::move(obfuscated_to_deobfuscated_members)})
39       .second;
40 }
41 
TranslateClass(StringId obfuscated_class_name) const42 std::optional<StringId> DeobfuscationMappingTable::TranslateClass(
43     StringId obfuscated_class_name) const {
44   if (PERFETTO_UNLIKELY(!default_package_id_.has_value())) {
45     return std::nullopt;
46   }
47   return TranslateClass(default_package_id_.value(), obfuscated_class_name);
48 }
49 
TranslateClass(const PackageId & package,StringId obfuscated_class_name) const50 std::optional<StringId> DeobfuscationMappingTable::TranslateClass(
51     const PackageId& package,
52     StringId obfuscated_class_name) const {
53   const ObfuscatedClassesToMembers* classes_translation_ptr =
54       class_per_package_translation_.Find(package);
55   if (classes_translation_ptr == nullptr) {
56     return std::nullopt;
57   }
58   const ClassTranslation* class_translation_ptr =
59       classes_translation_ptr->Find(obfuscated_class_name);
60   if (class_translation_ptr == nullptr) {
61     return std::nullopt;
62   }
63   return class_translation_ptr->deobfuscated_class_name;
64 }
65 
TranslateMember(const PackageId & package,StringId obfuscated_class_name,StringId obfuscated_member) const66 std::optional<StringId> DeobfuscationMappingTable::TranslateMember(
67     const PackageId& package,
68     StringId obfuscated_class_name,
69     StringId obfuscated_member) const {
70   const ObfuscatedClassesToMembers* classes_translation_ptr =
71       class_per_package_translation_.Find(package);
72   if (classes_translation_ptr == nullptr) {
73     return std::nullopt;
74   }
75 
76   const ClassTranslation* class_translation_ptr =
77       classes_translation_ptr->Find(obfuscated_class_name);
78   if (class_translation_ptr == nullptr) {
79     return std::nullopt;
80   }
81 
82   const StringId* member_translation_ptr =
83       class_translation_ptr->members.Find(obfuscated_member);
84   if (member_translation_ptr == nullptr) {
85     return std::nullopt;
86   }
87   return *member_translation_ptr;
88 }
89 
90 }  // namespace trace_processor
91 }  // namespace perfetto
92