parralelize the parsing

This commit is contained in:
Jean-Marie 'Histausse' Mineau 2024-03-08 16:16:43 +01:00
parent 675135f522
commit d47494f8f6
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
3 changed files with 61 additions and 4 deletions

52
Cargo.lock generated
View file

@ -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"

View file

@ -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"

View file

@ -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::<Result<Vec<_>, _>>()?;
self.classes.par_extend(classes);
self.not_referenced_strings
.extend(dex.get_not_resolved_strings()?.into_iter().map(DexString));
Ok(())