libredex/DexLoader.h (48 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
#include <boost/iostreams/device/mapped_file.hpp>
#include "DexClass.h"
#include "DexDefs.h"
#include "DexIdx.h"
#include "DexStats.h"
#include "DexUtil.h"
class DexLoader {
std::unique_ptr<DexIdx> m_idx;
const dex_class_def* m_class_defs;
DexClasses* m_classes;
std::unique_ptr<boost::iostreams::mapped_file> m_file;
const DexLocation* m_location;
public:
explicit DexLoader(const DexLocation* location);
const dex_header* get_dex_header(const char* file_name);
DexClasses load_dex(const char* file_name,
dex_stats_t* stats,
int support_dex_version);
DexClasses load_dex(const dex_header* dh, dex_stats_t* stats);
void load_dex_class(int num);
void gather_input_stats(dex_stats_t* stats, const dex_header* dh);
DexIdx* get_idx() { return m_idx.get(); }
};
DexClasses load_classes_from_dex(const DexLocation* location,
bool balloon = true,
bool throw_on_balloon_error = true,
int support_dex_version = 35);
DexClasses load_classes_from_dex(const DexLocation* location,
dex_stats_t* stats,
bool balloon = true,
bool throw_on_balloon_error = true,
int support_dex_version = 35);
DexClasses load_classes_from_dex(const dex_header* dh,
const DexLocation* location,
bool balloon = true,
bool throw_on_balloon_error = true);
std::string load_dex_magic_from_dex(const DexLocation* location);
void balloon_for_test(const Scope& scope);
static inline const uint8_t* align_ptr(const uint8_t* const ptr,
const size_t alignment) {
const size_t alignment_error = ((size_t)ptr) % alignment;
if (alignment_error != 0) {
return ptr - alignment_error + alignment;
} else {
return ptr;
}
}