diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/page/NewPatchScreen.kt b/manager/src/main/java/org/lsposed/lspatch/ui/page/NewPatchScreen.kt index 7b4fedb..57f0dfc 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/page/NewPatchScreen.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/page/NewPatchScreen.kt @@ -210,8 +210,8 @@ private fun PatchOptionsBody(modifier: Modifier, onAddEmbed: () -> Unit) { selected = !viewModel.useManager, onClick = { viewModel.useManager = false }, icon = Icons.Outlined.WorkOutline, - title = stringResource(R.string.patch_portable), - desc = stringResource(R.string.patch_portable_desc), + title = stringResource(R.string.patch_integrated), + desc = stringResource(R.string.patch_integrated_desc), extraContent = { TextButton( onClick = onAddEmbed, diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/page/manage/AppManagePage.kt b/manager/src/main/java/org/lsposed/lspatch/ui/page/manage/AppManagePage.kt index b450b7a..1a48d1a 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/page/manage/AppManagePage.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/page/manage/AppManagePage.kt @@ -158,7 +158,7 @@ fun AppManageBody( text = buildAnnotatedString { val (text, color) = if (it.second.useManager) stringResource(R.string.patch_local) to MaterialTheme.colorScheme.secondary - else stringResource(R.string.patch_portable) to MaterialTheme.colorScheme.tertiary + else stringResource(R.string.patch_integrated) to MaterialTheme.colorScheme.tertiary append(AnnotatedString(text, SpanStyle(color = color))) append(" ") if (isRolling) append(stringResource(R.string.manage_rolling)) diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/manage/AppManageViewModel.kt b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/manage/AppManageViewModel.kt index 9732117..7645791 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/manage/AppManageViewModel.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/manage/AppManageViewModel.kt @@ -89,7 +89,7 @@ class AppManageViewModel : ViewModel() { LSPPackageManager.cleanTmpApkDir() val apkPaths = listOf(appInfo.app.sourceDir) + (appInfo.app.splitSourceDirs ?: emptyArray()) val patchPaths = mutableListOf() - val embeddedModulePaths = if (config.useManager) emptyList() else null + val embeddedModulePaths = mutableListOf() for (apk in apkPaths) { ZipFile(apk).use { zip -> var entry = zip.getEntry(Constants.ORIGINAL_APK_ASSET_PATH) @@ -104,6 +104,19 @@ class AppManageViewModel : ViewModel() { } } } + ZipFile(appInfo.app.sourceDir).use { zip -> + zip.entries().iterator().forEach { entry -> + if (entry.name.startsWith(Constants.EMBEDDED_MODULES_ASSET_PATH)) { + val dst = lspApp.tmpApkDir.resolve(entry.name.substringAfterLast('/')) + embeddedModulePaths.add(dst.absolutePath) + zip.getInputStream(entry).use { input -> + dst.outputStream().use { output -> + input.copyTo(output) + } + } + } + } + } Patcher.patch(logger, Patcher.Options(config, patchPaths, embeddedModulePaths)) val (status, message) = LSPPackageManager.install() if (status != PackageInstaller.STATUS_SUCCESS) throw RuntimeException(message) diff --git a/manager/src/main/res/values/strings.xml b/manager/src/main/res/values/strings.xml index 1645295..8fdd584 100644 --- a/manager/src/main/res/values/strings.xml +++ b/manager/src/main/res/values/strings.xml @@ -53,8 +53,8 @@ Patch Mode Local Patch an app without modules embedded.\nThe patched app need the manager running in background, and Xposed scope can be changed dynamically without re-patch.\nLocal patched apps can only run on the local device. - Portable - Patch an app with modules embedded.\nThe patched app can run without the manager, but cannot be managed dynamically.\nPortable patched apps can be used on devices that do not have LSPatch Manager installed. + Integrated + Patch an app with modules embedded.\nThe patched app can run without the manager, but cannot be managed dynamically.\nIntegrated patched apps can be used on devices that do not have LSPatch Manager installed. Embed modules Debuggable Signature bypass diff --git a/patch-loader/src/main/java/org/lsposed/lspatch/service/LocalApplicationService.java b/patch-loader/src/main/java/org/lsposed/lspatch/service/LocalApplicationService.java index 37d6d6f..cc26ec5 100644 --- a/patch-loader/src/main/java/org/lsposed/lspatch/service/LocalApplicationService.java +++ b/patch-loader/src/main/java/org/lsposed/lspatch/service/LocalApplicationService.java @@ -8,6 +8,7 @@ import android.os.ParcelFileDescriptor; import android.util.Log; import org.lsposed.lspatch.loader.util.FileUtils; +import org.lsposed.lspatch.share.Constants; import org.lsposed.lspatch.util.ModuleLoader; import org.lsposed.lspd.models.Module; import org.lsposed.lspd.service.ILSPApplicationService; @@ -33,7 +34,7 @@ public class LocalApplicationService extends ILSPApplicationService.Stub { String modulePath = context.getCacheDir() + "/lspatch/" + packageName + "/"; String cacheApkPath; try (ZipFile sourceFile = new ZipFile(context.getPackageResourcePath())) { - cacheApkPath = modulePath + sourceFile.getEntry("assets/lspatch/modules/" + name).getCrc() + ".apk"; + cacheApkPath = modulePath + sourceFile.getEntry(Constants.EMBEDDED_MODULES_ASSET_PATH + name).getCrc() + ".apk"; } if (!Files.exists(Paths.get(cacheApkPath))) { diff --git a/patch/src/main/java/org/lsposed/patch/LSPatch.java b/patch/src/main/java/org/lsposed/patch/LSPatch.java index da7a1de..611f52c 100644 --- a/patch/src/main/java/org/lsposed/patch/LSPatch.java +++ b/patch/src/main/java/org/lsposed/patch/LSPatch.java @@ -1,6 +1,7 @@ package org.lsposed.patch; import static org.lsposed.lspatch.share.Constants.CONFIG_ASSET_PATH; +import static org.lsposed.lspatch.share.Constants.EMBEDDED_MODULES_ASSET_PATH; import static org.lsposed.lspatch.share.Constants.LOADER_DEX_ASSET_PATH; import static org.lsposed.lspatch.share.Constants.ORIGINAL_APK_ASSET_PATH; import static org.lsposed.lspatch.share.Constants.PROXY_APP_COMPONENT_FACTORY; @@ -306,7 +307,7 @@ public class LSPatch { var manifest = Objects.requireNonNull(ManifestParser.parseManifestFile(xmlIs)); var packageName = manifest.packageName; logger.i(" - " + packageName); - zFile.add("assets/lspatch/modules/" + packageName + ".apk", fileIs); + zFile.add(EMBEDDED_MODULES_ASSET_PATH + packageName + ".apk", fileIs); } catch (NullPointerException | IOException e) { logger.e(module + " does not exist or is not a valid apk file."); } diff --git a/share/java/src/main/java/org/lsposed/lspatch/share/Constants.java b/share/java/src/main/java/org/lsposed/lspatch/share/Constants.java index 240fa1b..f8a8f7f 100644 --- a/share/java/src/main/java/org/lsposed/lspatch/share/Constants.java +++ b/share/java/src/main/java/org/lsposed/lspatch/share/Constants.java @@ -6,6 +6,7 @@ public class Constants { final static public String LOADER_DEX_ASSET_PATH = "assets/lspatch/loader.dex"; final static public String META_LOADER_DEX_ASSET_PATH = "assets/lspatch/metaloader.dex"; final static public String ORIGINAL_APK_ASSET_PATH = "assets/lspatch/origin.apk"; + final static public String EMBEDDED_MODULES_ASSET_PATH = "assets/lspatch/modules/"; final static public String PATCH_FILE_SUFFIX = "-lspatched.apk"; final static public String PROXY_APP_COMPONENT_FACTORY = "org.lsposed.lspatch.metaloader.LSPAppComponentFactoryStub";