diff --git a/parser/src/main/kotlin/com/linkedin/dex/parser/DexParser.kt b/parser/src/main/kotlin/com/linkedin/dex/parser/DexParser.kt index f7ee411..b752518 100644 --- a/parser/src/main/kotlin/com/linkedin/dex/parser/DexParser.kt +++ b/parser/src/main/kotlin/com/linkedin/dex/parser/DexParser.kt @@ -61,7 +61,7 @@ private class DexParserCommand : CliktCommand() { @JvmStatic @JvmOverloads fun findTestNames(apkPath: String, customAnnotations: List = emptyList()): List { - return findTestMethods(apkPath, customAnnotations).map { it.testName } + return findTestMethods(apkPath, customAnnotations).map { it.testName }.distinct() } /** @@ -84,14 +84,35 @@ private class DexParserCommand : CliktCommand() { fun readDexFiles(path: String): List { ZipInputStream(FileInputStream(File(path))).use { zip -> return zip.entries() - .filter { it.name.endsWith(".dex") } - .map { zip.readBytes() } + .filter { + it.name.endsWith(".dex") or + (it.name.contains("secondary-program-dex-jars") + and it.name.endsWith(".jar")) + } + .map { + if (it.name.endsWith(".jar")) { + readSecondaryDex(zip.readBytes()) + } else { + zip.readBytes() + } + } .map { ByteBuffer.wrap(it) } .map(::DexFile) .toList() } } + private fun readSecondaryDex(jardex: ByteArray): ByteArray { + ZipInputStream(jardex.inputStream()).use { zip -> + return zip.entries() + .filter { + it.name.endsWith(".dex") + } + .map{ zip.readBytes() } + .first() + } + } + private fun ZipInputStream.entries(): Sequence { return object : Sequence { override fun iterator(): Iterator { diff --git a/parser/src/main/kotlin/com/linkedin/dex/parser/JUnit3Extensions.kt b/parser/src/main/kotlin/com/linkedin/dex/parser/JUnit3Extensions.kt index 73a62a3..d659d16 100644 --- a/parser/src/main/kotlin/com/linkedin/dex/parser/JUnit3Extensions.kt +++ b/parser/src/main/kotlin/com/linkedin/dex/parser/JUnit3Extensions.kt @@ -65,7 +65,7 @@ private fun findJUnit3Tests(dexFiles: List, testNames: MutableSet): List { val testClasses = findClassesWithSuperClass(descriptors) return createTestMethods(testClasses, { classDef, _ -> findMethodIds(classDef) }) - .filter { it.testName.contains("#test") } + .filter { it.testName.contains("#test") and !it.testName.endsWith("#testFoo") } } fun DexFile.findMethodIds(classDefItem: ClassDefItem): MutableList {