From 2051c6d51d5b358c7fe763e5664a85727cb02494 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Mon, 13 Jul 2026 13:24:27 -0400 Subject: [PATCH] Fix memory leak on APK extension install --- .../tachidesk/manga/impl/util/PackageTools.kt | 73 ++++++++++--------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/util/PackageTools.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/util/PackageTools.kt index 6b18e644..7b57ab8b 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/util/PackageTools.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/util/PackageTools.kt @@ -95,46 +95,47 @@ object PackageTools { /** A modified version of `xyz.nulldev.androidcompat.pm.InstalledPackage.info` */ fun getPackageInfo(apkFile: Path): PackageInfo = ApkParsers.getMetaInfo(apkFile.toFile()).toPackageInfo(apkFile.toFile()).apply { - val parsed = ApkFile(apkFile.toFile()) - val dbFactory = DocumentBuilderFactory.newInstance() - val dBuilder = dbFactory.newDocumentBuilder() - val doc = - parsed.manifestXml.byteInputStream().use { - dBuilder.parse(it) - } + ApkFile(apkFile.toFile()).use { parsed -> + val dbFactory = DocumentBuilderFactory.newInstance() + val dBuilder = dbFactory.newDocumentBuilder() + val doc = + parsed.manifestXml.byteInputStream().use { + dBuilder.parse(it) + } - logger.trace { parsed.manifestXml } + logger.trace { parsed.manifestXml } - applicationInfo.metaData = - Bundle().apply { - val appTag = doc.getElementsByTagName("application").item(0) + applicationInfo.metaData = + Bundle().apply { + val appTag = doc.getElementsByTagName("application").item(0) - appTag - ?.childNodes - ?.toList() - .orEmpty() - .asSequence() - .filter { - it.nodeType == Node.ELEMENT_NODE - }.map { - it as Element - }.filter { - it.tagName == "meta-data" - }.forEach { - putString( - it.attributes.getNamedItem("android:name").nodeValue, - it.attributes.getNamedItem("android:value").nodeValue, - ) - } - } + appTag + ?.childNodes + ?.toList() + .orEmpty() + .asSequence() + .filter { + it.nodeType == Node.ELEMENT_NODE + }.map { + it as Element + }.filter { + it.tagName == "meta-data" + }.forEach { + putString( + it.attributes.getNamedItem("android:name").nodeValue, + it.attributes.getNamedItem("android:value").nodeValue, + ) + } + } - signatures = - ( - parsed.apkSingers.flatMap { it.certificateMetas } - // + parsed.apkV2Singers.flatMap { it.certificateMetas } - ) // Blocked by: https://github.com/hsiafan/apk-parser/issues/72 - .map { Signature(it.data) } - .toTypedArray() + signatures = + ( + parsed.apkSingers.flatMap { it.certificateMetas } + // + parsed.apkV2Singers.flatMap { it.certificateMetas } + ) // Blocked by: https://github.com/hsiafan/apk-parser/issues/72 + .map { Signature(it.data) } + .toTypedArray() + } } fun getSignatureHash(pkgInfo: PackageInfo): String? {