Dieses Tool befindet sich noch in der frühen Entwicklungsphase. Es ist bekannt, dass es unvollständig und incorrekt ist.
new oder delete .clang-format mit der vorgesehenen .clang-format Datei formatiert werden, bevor sie sich zum Repository verpflichten. Jitana verwendet CMake, das Out-of-Source-Build unterstützt. In diesem Dokument wird die folgende Verzeichnisstruktur angenommen:
.
├── jitana (source code downloaded)
├── dex (DEX files)
└── build (build directory you make)
Installieren Sie zuerst alle Abhängigkeiten. Dann
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ../jitana
make -j8
Bitte beachten Sie, dass Jitana unter Linux zusammengestellt wird.
Bitte beachten Sie, dass Jitana unter Windows zusammengestellt wird.
Jitana wird aufgrund der folgenden Ideen unter Verwendung der generischen Programmierungstechniken und nicht mit den traditionellen objektorientierten Techniken implementiert:
jitana::virtual_machinejitana::loader_graph loaders()jitana::loader_graph_propertyjitana::loader_edge_property = jitana::any_edge_propertyjitana::loader_vertex_propertyjitana::class_loader loaderjitana::dex_filejitana::class_graph classes()jitana::class_graph_propertystd::unordered_map<jitana::jvm_type_hdl, jitana::class_vertex_descriptor> jvm_hdl_to_vertexstd::unordered_map<jitana::dex_type_hdl, jitana::class_vertex_descriptor> hdl_to_vertexjitana::class_edge_property = jitana::any_edge_propertyjitana::class_vertex_propertyjitana::dex_type_hdl hdljitana::jvm_type_hdl jvm_hdljitana::dex_access_flags access_flagsstd::vector<jitana::dex_field_hdl> static_fieldsstd::vector<jitana::dex_field_hdl> instance_fieldsstd::vector<jitana::dex_method_hdl> dtablestd::vector<jitana::dex_method_hdl> vtableuint16_t static_sizeuint16_t instance_sizejitana::method_graph methods()jitana::method_graph_propertystd::unordered_map<jitana::jvm_method_hdl, jitana::method_vertex_descriptor> jvm_hdl_to_vertexstd::unordered_map<jitana::dex_method_hdl, jitana::method_vertex_descriptor> hdl_to_vertexjitana::method_edge_property = jitana::any_edge_propertyjitana::method_vertex_propertyjitana::dex_method_hdl hdljitana::jvm_method_hdl jvm_hdljitana::dex_type_hdl class_hdljitana::dex_access_flags access_flagsstd::vector<jitana::method_param> paramsjitana::insn_graph insnsjitana::insn_graph_propertystd::unordered_map<uint16_t, jitana::insn_vertex_descriptor> offset_to_vertexjitana::dex_method_hdl hdljitana::jvm_method_hdl jvm_hdlstd::vector<jitana::try_catch_block> try_catchessize_t registers_sizesize_t ins_sizesize_t outs_sizeuint32_t insns_offjitana::insn_edge_property = jitana::any_edge_propertyjitana::insn_vertex_propertyjitana::dex_insn_hdl hdljitana::insn insnlong long counter = 0uint32_t offint line_num = 0Ein Handle wird verwendet, um ein virtuelles Maschinenobjekt (Klasse, Methode, Anweisung usw.) in Jitana zu identifizieren. Es gibt zwei Arten von Griffen:
Include/Jitana/Hdl.hpp finden Sie implementierenden Details.
+--------------------------------+---------------------------------+
| DEX Handle | JVM Handle |
| (Android specific: int based) | (General Java: string based) |
+----------+--------------------------------+---------------------------------+
| Class | struct class_loader_hdl { |
| Loader | uint8_t idx; |
| | } |
+----------+--------------------------------+---------------------------------+
| DEX | struct dex_file_hdl { | N/A |
| File | class_loader_hdl loader_hdl; | (No concept of DEX file in JVM) |
| | uint8_t idx; | |
| | }; | |
+----------+--------------------------------+---------------------------------+
| Type | struct dex_type_hdl { | struct jvm_type_hdl { |
| | dex_file_hdl file_hdl; | class_loader_hdl loader_hdl; |
| | uint16_t idx; | std::string descriptor; |
| | }; | }; |
+----------+--------------------------------+---------------------------------+
| Method | struct dex_method_hdl { | struct jvm_method_hdl { |
| | dex_file_hdl file_hdl; | jvm_type_hdl type_hdl; |
| | uint16_t idx; | std::string unique_name; |
| | }; | }; |
+----------+--------------------------------+---------------------------------+
| Field | struct dex_field_hdl { | struct jvm_field_hdl { |
| | dex_file_hdl file; | jvm_type_hdl type_hdl; |
| | uint16_t idx; | std::string unique_name; |
| | }; | }; |
+----------+--------------------------------+---------------------------------+
| Instruc- | struct dex_insn_hdl { | N/A |
| tion | dex_method_hdl method_hdl; | |
| | uint16_t idx; | |
| | }; | |
+----------+--------------------------------+---------------------------------+
| Register | struct dex_reg_hdl { | N/A |
| | dex_insn_hdl insn_hdl; | |
| | uint16_t idx; | |
| | }; | |
+----------+--------------------------------+---------------------------------+Wir haben einen oder mehrere initiierende Griffe und einen einzigartigen Definitionsgriff für jedes VM -Objekt:
virtual_machine::find_*() aufgerufen wird.Diese Konzepte spiegeln die definierenden Lader und die in der JVM -Spezifikation beschriebenen Lader wider.
Für den Einfachheit halber sollten Sie Ihr eigenes Tool unter tools/ so erstellen, dass das Build -System Ihre CMakeLists.txt automatisch lesen kann. Sie können tools/jitana-graph/ als Beispiel verwenden.
# include < jitana/jitana.hpp >
int main ()
{
// 1. Create a virtual machine.
jitana::virtual_machine vm;
// 2a. Create and add a system class loader.
{
const auto & filenames = { " dex/system/framework/core.dex " ,
" dex/system/framework/framework.dex " ,
" dex/system/framework/framework2.dex " ,
" dex/system/framework/ext.dex " ,
" dex/system/framework/conscrypt.dex " ,
" dex/system/framework/okhttp.dex " };
jitana::class_loader loader ( 11 , " SystemLoader " , begin (filenames),
end (filenames));
vm. add_loader (loader);
}
// 2b. Create and add an application class loader.
{
const auto & filenames = { " dex/app/instagram_classes.dex " };
jitana::loader loader ( 22 , " Instagram " , begin (filenames),
end (filenames));
vm. add_loader (loader, 11 );
}
// 3a. Load a specific class.
// You need to specify fully qualified Java binary name.
{
bool try_to_load = true ;
vm. find_class ({ 22 , " Ljava/lang/BootClassLoader; " }, try_to_load);
}
// 3b. Or, load everything from a class loader.
vm. load_all_classes ( 22 );
}