digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__android_super {
label="AndroidSuper";
graph[style=dotted];
android_super__seq [label=<
>];
android_super__inst__root [label=<
pos | size | type | id |
4096 | ... | Root | root |
>];
subgraph cluster__root {
label="AndroidSuper::Root";
graph[style=dotted];
root__seq [label=<
pos | size | type | id |
0 | 4096 | Geometry | primary_geometry |
4096 | 4096 | Geometry | backup_geometry |
8192 | primary_geometry.metadata_max_size | Metadata | primary_metadata |
repeat primary_geometry.metadata_slot_count times |
... | primary_geometry.metadata_max_size | Metadata | backup_metadata |
repeat primary_geometry.metadata_slot_count times |
>];
}
subgraph cluster__geometry {
label="AndroidSuper::Geometry";
graph[style=dotted];
geometry__seq [label=<
pos | size | type | id |
0 | 4 | | magic |
4 | 4 | u4le | struct_size |
8 | 32 | | checksum |
40 | 4 | u4le | metadata_max_size |
44 | 4 | u4le | metadata_slot_count |
48 | 4 | u4le | logical_block_size |
>];
}
subgraph cluster__metadata {
label="AndroidSuper::Metadata";
graph[style=dotted];
metadata__seq [label=<
pos | size | type | id |
0 | 4 | | magic |
4 | 2 | u2le | major_version |
6 | 2 | u2le | minor_version |
8 | 4 | u4le | header_size |
12 | 32 | | header_checksum |
44 | 4 | u4le | tables_size |
48 | 32 | | tables_checksum |
80 | 12 | TableDescriptor | partitions |
92 | 12 | TableDescriptor | extents |
104 | 12 | TableDescriptor | groups |
116 | 12 | TableDescriptor | block_devices |
>];
subgraph cluster__block_device {
label="AndroidSuper::Metadata::BlockDevice";
graph[style=dotted];
block_device__seq [label=<
pos | size | type | id |
0 | 8 | u8le | first_logical_sector |
8 | 4 | u4le | alignment |
12 | 4 | u4le | alignment_offset |
16 | 8 | u8le | size |
24 | 36 | str(UTF-8) | partition_name |
60 | 1b | BitsType1(LittleBitEndian) | flag_slot_suffixed |
60:1 | 31b | b31 | flags_reserved |
>];
}
subgraph cluster__extent {
label="AndroidSuper::Metadata::Extent";
graph[style=dotted];
extent__seq [label=<
pos | size | type | id |
0 | 8 | u8le | num_sectors |
8 | 4 | u4le→TargetType | target_type |
12 | 8 | u8le | target_data |
20 | 4 | u4le | target_source |
>];
}
subgraph cluster__table_descriptor {
label="AndroidSuper::Metadata::TableDescriptor";
graph[style=dotted];
table_descriptor__seq [label=<
pos | size | type | id |
0 | 4 | u4le | offset |
4 | 4 | u4le | num_entries |
8 | 4 | u4le | entry_size |
>];
table_descriptor__inst__table [label=<
pos | size | type | id |
(_parent.header_size + offset) | ... | switch (kind) | table |
repeat num_entries times |
>];
table_descriptor__inst__table_table_switch [label=<
case | type |
:table_kind_partitions | Partition |
:table_kind_extents | Extent |
:table_kind_groups | Group |
:table_kind_block_devices | BlockDevice |
>];
}
subgraph cluster__partition {
label="AndroidSuper::Metadata::Partition";
graph[style=dotted];
partition__seq [label=<
pos | size | type | id |
0 | 36 | str(UTF-8) | name |
36 | 1b | BitsType1(LittleBitEndian) | attr_readonly |
36:1 | 1b | BitsType1(LittleBitEndian) | attr_slot_suffixed |
36:2 | 1b | BitsType1(LittleBitEndian) | attr_updated |
36:3 | 1b | BitsType1(LittleBitEndian) | attr_disabled |
36:4 | 28b | b28 | attrs_reserved |
40 | 4 | u4le | first_extent_index |
44 | 4 | u4le | num_extents |
48 | 4 | u4le | group_index |
>];
}
subgraph cluster__group {
label="AndroidSuper::Metadata::Group";
graph[style=dotted];
group__seq [label=<
pos | size | type | id |
0 | 36 | str(UTF-8) | name |
36 | 1b | BitsType1(LittleBitEndian) | flag_slot_suffixed |
36:1 | 31b | b31 | flags_reserved |
40 | 8 | u8le | maximum_size |
>];
}
}
}
android_super__inst__root:root_type -> root__seq [style=bold];
root__seq:primary_geometry_type -> geometry__seq [style=bold];
root__seq:backup_geometry_type -> geometry__seq [style=bold];
geometry__seq:metadata_max_size_type -> root__seq:primary_metadata_size [color="#404040"];
root__seq:primary_metadata_type -> metadata__seq [style=bold];
geometry__seq:metadata_slot_count_type -> root__seq:primary_metadata__repeat [color="#404040"];
geometry__seq:metadata_max_size_type -> root__seq:backup_metadata_size [color="#404040"];
root__seq:backup_metadata_type -> metadata__seq [style=bold];
geometry__seq:metadata_slot_count_type -> root__seq:backup_metadata__repeat [color="#404040"];
metadata__seq:partitions_type -> table_descriptor__seq [style=bold];
metadata__seq:extents_type -> table_descriptor__seq [style=bold];
metadata__seq:groups_type -> table_descriptor__seq [style=bold];
metadata__seq:block_devices_type -> table_descriptor__seq [style=bold];
metadata__seq:header_size_type -> table_descriptor__inst__table:table_pos [color="#404040"];
table_descriptor__seq:offset_type -> table_descriptor__inst__table:table_pos [color="#404040"];
table_descriptor__inst__table:table_type -> table_descriptor__inst__table_table_switch [style=bold];
table_descriptor__inst__table_table_switch:case0 -> partition__seq [style=bold];
table_descriptor__inst__table_table_switch:case1 -> extent__seq [style=bold];
table_descriptor__inst__table_table_switch:case2 -> group__seq [style=bold];
table_descriptor__inst__table_table_switch:case3 -> block_device__seq [style=bold];
table_descriptor__params:kind_type -> table_descriptor__inst__table:table_type [color="#404040"];
table_descriptor__seq:num_entries_type -> table_descriptor__inst__table:table__repeat [color="#404040"];
}