From fced5612fbee4c272c5e48f1c5557d0f04a2d273 Mon Sep 17 00:00:00 2001 From: WeiguangTWK Date: Thu, 2 Apr 2026 20:43:21 +0800 Subject: [PATCH] Patcher: Fix fail when select installed app --- .../main/java/org/lsposed/npatch/Patcher.kt | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/manager/src/main/java/org/lsposed/npatch/Patcher.kt b/manager/src/main/java/org/lsposed/npatch/Patcher.kt index 3ce2a40..9596550 100644 --- a/manager/src/main/java/org/lsposed/npatch/Patcher.kt +++ b/manager/src/main/java/org/lsposed/npatch/Patcher.kt @@ -12,6 +12,7 @@ import org.lsposed.patch.NPatch import org.lsposed.patch.util.Logger import java.io.File import java.io.IOException +import java.util.zip.ZipFile object Patcher { @@ -22,7 +23,37 @@ object Patcher { private val apkPaths: List, private val embeddedModules: List? ) { - fun toStringArray(): Array { + fun resolveApkPaths(logger: Logger): List { + val restoredDir = File(lspApp.tmpApkDir, "origin_sources") + if (!restoredDir.exists()) { + restoredDir.mkdirs() + } + return apkPaths.map { sourcePath -> + try { + ZipFile(sourcePath).use { zip -> + val originEntry = zip.getEntry(Constants.ORIGINAL_APK_ASSET_PATH) + ?: zip.getEntry("assets/npatch/origin_apk.bin") + if (originEntry == null) { + sourcePath + } else { + val sourceName = File(sourcePath).name + val restoredApk = File(restoredDir, sourceName) + zip.getInputStream(originEntry).use { input -> + restoredApk.outputStream().use { output -> + input.copyTo(output) + } + } + logger.i("Detected patched APK, fallback to embedded origin: $sourcePath -> ${restoredApk.absolutePath}") + restoredApk.absolutePath + } + } + } catch (_: Throwable) { + sourcePath + } + } + } + + fun toStringArray(resolvedApkPaths: List = apkPaths): Array { return buildList { add("-o"); add(lspApp.tmpApkDir.absolutePath) add("-p"); add(config.newPackage) @@ -40,14 +71,15 @@ object Patcher { if (!MyKeyStore.useDefault) { addAll(arrayOf("-k", MyKeyStore.file.path, Configs.keyStorePassword, Configs.keyStoreAlias, Configs.keyStoreAliasPassword)) } - addAll(apkPaths) + addAll(resolvedApkPaths) }.toTypedArray() } } suspend fun patch(logger: Logger, options: Options) { withContext(Dispatchers.IO) { - NPatch(logger, *options.toStringArray()).doCommandLine() + val resolvedApkPaths = options.resolveApkPaths(logger) + NPatch(logger, *options.toStringArray(resolvedApkPaths)).doCommandLine() val uri = Configs.storageDirectory?.toUri() ?: throw IOException("Uri is null")