diff --git a/Cargo.lock b/Cargo.lock index b0dd360..f190954 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,6 +28,7 @@ dependencies = [ "log", "pyo3 0.20.0", "pyo3-log", + "rayon", "serde", "serde_json", "sha1", @@ -144,6 +145,31 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + [[package]] name = "crypto-common" version = "0.1.6" @@ -164,6 +190,12 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + [[package]] name = "flate2" version = "1.0.28" @@ -485,6 +517,26 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rayon" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.2.16" diff --git a/androscalpel/Cargo.toml b/androscalpel/Cargo.toml index 6b39ffa..f176681 100644 --- a/androscalpel/Cargo.toml +++ b/androscalpel/Cargo.toml @@ -16,6 +16,7 @@ apk_frauder = { version = "0.1.0", path = "../apk_frauder" } log = "0.4.20" pyo3 = { version = "0.20.0", features = ["anyhow"] } pyo3-log = "0.8.3" +rayon = "1.9.0" serde = { version = "1.0.195", features = ["derive"] } serde_json = "1.0.111" sha1 = "0.10.6" diff --git a/androscalpel/src/apk.rs b/androscalpel/src/apk.rs index 31d2331..823789c 100644 --- a/androscalpel/src/apk.rs +++ b/androscalpel/src/apk.rs @@ -15,6 +15,7 @@ use crate::Result; use crate::*; use androscalpel_serializer::Instruction as InsFormat; use androscalpel_serializer::*; +use rayon::prelude::*; /// Represent an apk. #[pyclass] @@ -33,10 +34,13 @@ impl Apk { /// Add the content of a dex file to the apk. pub fn add_dex_file(&mut self, data: &[u8]) -> Result<()> { let mut dex = DexFileReader::new(data)?; - for class in dex.get_class_defs() { - let class = self.get_class_from_dex_file(class, &dex)?; - self.classes.insert(class.descriptor.clone(), class); - } + let classes = dex + .get_class_defs() + .par_iter() + .map(|class| self.get_class_from_dex_file(class, &dex)) + .map(|class| class.map(|class| (class.descriptor.clone(), class))) + .collect::, _>>()?; + self.classes.par_extend(classes); self.not_referenced_strings .extend(dex.get_not_resolved_strings()?.into_iter().map(DexString)); Ok(())