libredex/BundleResources.h (81 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
// TODO (T91001948): Integrate protobuf dependency in supported platforms for
// open source
#ifdef HAS_PROTOBUF
#include "RedexResources.h"
#include <map>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include "protores/Resources.pb.h"
#include <google/protobuf/repeated_field.h>
using ConfigValues = google::protobuf::RepeatedPtrField<aapt::pb::ConfigValue>;
class ResourcesPbFile : public ResourceTableFile {
public:
~ResourcesPbFile() override;
void collect_resid_values_and_hashes(
const std::vector<uint32_t>& ids,
std::map<size_t, std::vector<uint32_t>>* res_by_hash) override;
void remap_file_paths_and_serialize(
const std::vector<std::string>& resource_files,
const std::unordered_map<std::string, std::string>& old_to_new) override;
void remap_res_ids_and_serialize(
const std::vector<std::string>& resource_files,
const std::map<uint32_t, uint32_t>& old_to_new) override;
bool resource_value_identical(uint32_t a_id, uint32_t b_id) override;
std::unordered_set<uint32_t> get_types_by_name(
const std::unordered_set<std::string>& type_names) override;
std::vector<std::string> get_files_by_rid(
uint32_t res_id,
ResourcePathType path_type = ResourcePathType::DevicePath) override;
void walk_references_for_resource(
uint32_t resID,
ResourcePathType path_type,
std::unordered_set<uint32_t>* nodes_visited,
std::unordered_set<std::string>* potential_file_paths) override;
void delete_resource(uint32_t res_id) override;
void collect_resource_data_for_file(const std::string& resources_pb_path);
size_t get_hash_from_values(const ConfigValues& config_values);
const std::map<uint32_t, const ConfigValues>& get_res_id_to_configvalue()
const {
return m_res_id_to_configvalue;
}
std::string resolve_module_name_for_resource_id(uint32_t res_id);
private:
uint32_t m_package_id = 0xFFFFFFFF;
std::map<uint32_t, std::string> m_type_id_to_names;
std::unordered_set<uint32_t> m_existed_res_ids;
std::map<uint32_t, const ConfigValues> m_res_id_to_configvalue;
std::map<uint32_t, std::string> m_package_id_to_module_name;
std::unordered_set<uint32_t> m_ids_to_remove;
};
class BundleResources : public AndroidResources {
public:
explicit BundleResources(const std::string& directory)
: AndroidResources(directory) {}
~BundleResources() override;
boost::optional<int32_t> get_min_sdk() override;
ManifestClassInfo get_manifest_class_info() override;
std::unordered_set<uint32_t> get_xml_reference_attributes(
const std::string& filename) override;
void collect_layout_classes_and_attributes_for_file(
const std::string& file_path,
const std::unordered_set<std::string>& attributes_to_read,
std::unordered_set<std::string>* out_classes,
std::unordered_multimap<std::string, std::string>* out_attributes)
override;
size_t remap_xml_reference_attributes(
const std::string& filename,
const std::map<uint32_t, uint32_t>& kept_to_remapped_ids) override;
std::vector<std::string> find_resources_files() override;
std::unique_ptr<ResourceTableFile> load_res_table() override;
std::unordered_set<std::string> find_all_xml_files() override;
std::string get_base_assets_dir() override;
protected:
std::vector<std::string> find_res_directories() override;
std::vector<std::string> find_lib_directories() override;
bool rename_classes_in_layout(
const std::string& file_path,
const std::map<std::string, std::string>& rename_map,
size_t* out_num_renamed) override;
};
#endif // HAS_PROTOBUF