blob: 9beeab9c0d249608256283e9d0c18d271134eff3 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_DEOBFUSCATION_MAPPING_TABLE_H_
#define SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_DEOBFUSCATION_MAPPING_TABLE_H_
#include <cstdint>
#include <optional>
#include <string>
#include <vector>
#include "perfetto/ext/base/flat_hash_map.h"
#include "perfetto/ext/base/hash.h"
#include "perfetto/ext/base/string_view.h"
#include "src/trace_processor/storage/trace_storage.h"
namespace perfetto {
namespace trace_processor {
// Constains deobfuscation for Java class names and its members per |PackageId|.
class DeobfuscationMappingTable {
public:
struct PackageId {
std::string package_name;
int64_t version_code;
bool operator==(const PackageId& other) const {
return package_name == other.package_name &&
version_code == other.version_code;
}
};
// For the given |package| and |obfuscated_class_name| adds translations of
// the class and its members.
//
// Returns `true` if the translation for the given class
// was inserted, `false` if there is already a translation for the given
// class.
bool AddClassTranslation(
const PackageId& package,
StringId obfuscated_class_name,
StringId deobfuscated_class_name,
base::FlatHashMap<StringId, StringId> obfuscated_to_deobfuscated_members);
// These functions return the deobfuscated class/member name from an
// obfuscated class/member name.
// If a package is not provided, the |default_package_id_| is used.
// If translation is not found, returns std::nullopt.
std::optional<StringId> TranslateClass(StringId obfuscated_class_name) const;
std::optional<StringId> TranslateClass(const PackageId& package,
StringId obfuscated_class_name) const;
std::optional<StringId> TranslateMember(const PackageId& package,
StringId obfuscated_class_name,
StringId obfuscated_member) const;
private:
struct PackageIdHash {
std::size_t operator()(PackageId const& p) const noexcept {
return static_cast<std::size_t>(
base::Hasher::Combine(p.package_name, p.version_code));
}
};
using ObfuscatedToDeobfuscatedMembers = base::FlatHashMap<StringId, StringId>;
struct ClassTranslation {
StringId deobfuscated_class_name;
ObfuscatedToDeobfuscatedMembers members;
};
using ObfuscatedClassesToMembers =
base::FlatHashMap<StringId, ClassTranslation>;
base::FlatHashMap<PackageId, ObfuscatedClassesToMembers, PackageIdHash>
class_per_package_translation_;
// To translate entities which don't have a package id, we will use
// |default_package_id_|. |default_package_id_| is a package id of the first
// inserted entity with a package id;
// We need this because curently TraceProcessor doesn't use the package
// version of the arguments.
// TODO(b/244700870): start use the package version of arguments.
std::optional<PackageId> default_package_id_;
};
} // namespace trace_processor
} // namespace perfetto
#endif // SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_DEOBFUSCATION_MAPPING_TABLE_H_