use super::{Uleb128, Sleb128};
#[derive(Debug, PartialEq)]
pub struct RawDexFile {
pub header: RawHeader,
pub string_id_items: Vec<u32>,
pub type_id_items: Vec<u32>,
pub proto_id_items: Vec<RawPrototype>,
pub field_id_items: Vec<RawField>,
pub method_id_items: Vec<RawMethod>,
pub class_def_items: Vec<RawClassDefinition>,
pub call_site_idxs: Option<Vec<u32>>,
pub method_handle_idxs: Option<Vec<RawMethodHandleItem>>,
pub data: Vec<u8>,
pub link_data: Option<Vec<u8>>
}
#[derive(Debug, PartialEq)]
pub struct RawHeader {
pub version: i32,
pub checksum: u32,
pub signature: [u8; 20],
pub file_size: u32,
pub header_size: u32,
pub endian_tag: u32,
pub link_size: u32,
pub link_off: u32,
pub map_off: u32,
pub string_ids_size: u32,
pub string_ids_off: u32,
pub type_ids_size: u32,
pub type_ids_off: u32,
pub proto_ids_size: u32,
pub proto_ids_off: u32,
pub field_ids_size: u32,
pub field_ids_off: u32,
pub method_ids_size: u32,
pub method_ids_off: u32,
pub class_defs_size: u32,
pub class_defs_off: u32,
pub data_size: u32,
pub data_off: u32
}
#[derive(Debug, PartialEq)]
pub struct RawClassDataItem {
pub static_fields_size: Uleb128,
pub instance_fields_size: Uleb128,
pub direct_methods_size: Uleb128,
pub virtual_methods_size: Uleb128,
pub static_fields: Vec<RawEncodedField>,
pub instance_fields: Vec<RawEncodedField>,
pub direct_methods: Vec<RawEncodedMethod>,
pub virtual_methods: Vec<RawEncodedMethod>
}
#[derive(Debug, PartialEq)]
pub struct RawEncodedField {
pub field_idx_diff: Uleb128,
pub access_flags: Uleb128
}
#[derive(Debug, PartialEq)]
pub struct RawEncodedMethod {
pub method_idx_diff: Uleb128,
pub access_flags: Uleb128,
pub code_off: Uleb128
}
#[derive(Debug, PartialEq)]
pub struct RawAnnotations {
pub class_annotations_off: u32,
pub fld_annot: Option<Vec<RawFieldAnnotation>>,
pub mtd_annot: Option<Vec<RawMethodAnnotation>>,
pub prm_annot: Option<Vec<RawParameterAnnotation>>
}
#[derive(Debug, PartialEq)]
pub struct RawFieldAnnotation {
pub field_idx: u32,
pub annotations_offset: u32
}
#[derive(Debug, PartialEq)]
pub struct RawMethodAnnotation {
pub method_idx: u32,
pub annotations_offset: u32
}
#[derive(Debug, PartialEq)]
pub struct RawParameterAnnotation {
pub method_idx: u32,
pub annotations_offset: u32
}
#[derive(Debug, PartialEq)]
pub struct RawTypeList {
pub size: u32,
pub list: Vec<u16>
}
#[derive(Debug, PartialEq)]
pub struct RawAnnotationSetItem {
pub size: u32,
pub entries: Vec<u32>
}
#[derive(Debug, PartialEq)]
pub struct RawAnnotationSetRefList {
pub size: u32,
pub entries: Vec<u32>
}
#[derive(Debug, PartialEq)]
pub struct RawMethod {
pub class_idx: u16,
pub proto_idx: u16,
pub name_idx: u32
}
#[derive(Debug, PartialEq)]
pub struct RawStringData {
pub utf16_size: u32,
pub data: String
}
#[derive(Debug, PartialEq)]
pub struct RawClassDefinition {
pub class_idx: u32,
pub access_flags: u32,
pub superclass_idx: u32,
pub interfaces_off: u32,
pub source_file_idx: u32,
pub annotations_off: u32,
pub class_data_off: u32,
pub static_values_off: u32
}
#[derive(Debug, PartialEq)]
pub struct RawField {
pub class_idx: u16,
pub type_idx: u16,
pub name_idx: u32
}
#[derive(Debug, PartialEq)]
pub struct RawPrototype {
pub shorty_idx: u32,
pub return_type_idx: u32,
pub parameters_off: u32
}
#[derive(Debug, PartialEq)]
pub struct RawMapList {
pub size: u32,
pub list: Vec<RawMapListItem>
}
#[derive(Debug, PartialEq)]
pub struct RawMapListItem {
pub type_: MapListItemType,
pub unused: u16,
pub size: u32,
pub offset: u32
}
#[derive(Debug, PartialEq)]
pub struct RawMethodHandleItem {
pub type_: u16,
pub unused_1: u16,
pub field_or_method_id: u16,
pub unused_2: u16
}
#[derive(Debug, PartialEq)]
pub struct RawCodeItem {
pub registers_size: u16,
pub ins_size: u16,
pub outs_size: u16,
pub tries_size: u16,
pub debug_info_off: u32,
pub insns_size: u32,
pub insns: Vec<u16>,
pub padding: Option<u16>,
pub tries: Option<Vec<RawTryItem>>
}
#[derive(Debug, PartialEq)]
pub struct RawTryItem {
pub start_addr: u32,
pub insn_count: u16,
pub handler_off: u16
}
#[derive(Debug, PartialEq)]
pub struct RawEncodedCatchHandlerList {
pub size: Uleb128,
pub list: Vec<RawEncodedCatchHandler>
}
#[derive(Debug, PartialEq)]
pub struct RawEncodedCatchHandler {
pub size: Sleb128,
pub handlers: Vec<RawEncodedTypeAddrPair>,
pub catch_all_addr: Option<Uleb128>
}
#[derive(Debug, PartialEq)]
pub struct RawEncodedTypeAddrPair {
pub type_idx: Uleb128,
pub addr: Uleb128
}
#[derive(Debug, PartialEq)]
pub struct RawDebugInfoItem {
pub line_start: Uleb128,
pub parameters_size: Uleb128,
pub parameter_names: Vec<Sleb128>,
pub bytecode: Vec<u8>
}
#[allow(non_camel_case_types)]
#[derive(Debug, PartialEq)]
pub enum MapListItemType {
HEADER_ITEM,
STRING_ID_ITEM,
TYPE_ID_ITEM,
PROTO_ID_ITEM,
FIELD_ID_ITEM,
METHOD_ID_ITEM,
CLASS_DEF_ITEM,
CALL_SITE_ID_ITEM,
METHOD_HANDLE_ITEM,
MAP_LIST,
TYPE_LIST,
ANNOTATION_SET_REF_LIST,
ANNOTATION_SET_ITEM,
CLASS_DATA_ITEM,
CODE_ITEM,
STRING_DATA_ITEM,
DEBUG_INFO_ITEM,
ANNOTATION_ITEM,
ENCODED_ARRAY_ITEM,
ANNOTATIONS_DIRECTORY_ITEM
}