From ea150e2ad3baafb0d6a416395c2b52ad478b0b0b Mon Sep 17 00:00:00 2001 From: xihan123 Date: Thu, 17 Oct 2024 19:18:43 +0800 Subject: [PATCH 1/9] Update dependencies --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b82aa23a4..0aaefbcaf 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From f51a99c5abc375073bb071111124de2e0b602d40 Mon Sep 17 00:00:00 2001 From: xihan123 Date: Thu, 17 Oct 2024 23:32:28 +0800 Subject: [PATCH 2/9] Update dependencies --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index fd7aef071..3fe9357b4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -53,7 +53,7 @@ val coreVerName by extra(coreLatestTag) val androidMinSdkVersion by extra(28) val androidTargetSdkVersion by extra(35) val androidCompileSdkVersion by extra(35) -val androidCompileNdkVersion by extra("27.0.12077973") +val androidCompileNdkVersion by extra("27.1.12297006") val androidBuildToolsVersion by extra("35.0.0") val androidSourceCompatibility by extra(JavaVersion.VERSION_21) val androidTargetCompatibility by extra(JavaVersion.VERSION_21) From 35ab71e9ae769b6ae061dd59fd7b693993b0981c Mon Sep 17 00:00:00 2001 From: xihan123 Date: Thu, 17 Oct 2024 23:42:11 +0800 Subject: [PATCH 3/9] Update JingMatrix/LSPosed --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index db9b97e53..9c9dafca0 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit db9b97e53d39bb06d8ba706b74ccf01a80f2221c +Subproject commit 9c9dafca00a1165d5d0cabdd0d81850105873d42 From 21e5133836fe7647e8f17bd84fc5879c2c614797 Mon Sep 17 00:00:00 2001 From: xihan123 Date: Fri, 18 Oct 2024 14:08:41 +0800 Subject: [PATCH 4/9] Update JingMatrix/LSPosed --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 9c9dafca0..ff04a6882 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 9c9dafca00a1165d5d0cabdd0d81850105873d42 +Subproject commit ff04a688222c18b154311cde344d312de6f53cce From b49d099fc030c9fceae604bffbdc2c5b5a489c07 Mon Sep 17 00:00:00 2001 From: xihan123 Date: Sun, 10 Nov 2024 17:53:38 +0800 Subject: [PATCH 5/9] =?UTF-8?q?feat(patch):=20=E6=B7=BB=E5=8A=A0=20Dex=20?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 LSPatch 中增加 dexMode 参数,用于选择 Dex 处理模式 - 在 AppManageViewModel 和 NewPatchViewModel 中添加 Dex 模式的相关逻辑 - 更新 NewPatchScreen UI,增加 Dex 模式选择功能 - 在 Patcher 中处理 Dex 模式参数 - 更新相关资源文件,添加 Dex 模式的字符串定义 --- .../main/java/org/lsposed/lspatch/Patcher.kt | 2 + .../lsposed/lspatch/ui/page/NewPatchScreen.kt | 38 +++++++++++++++++++ .../lspatch/ui/viewmodel/NewPatchViewModel.kt | 3 ++ .../ui/viewmodel/manage/AppManageViewModel.kt | 2 +- .../src/main/res/values-zh-rCN/strings.xml | 3 ++ .../src/main/res/values-zh-rTW/strings.xml | 3 ++ manager/src/main/res/values/strings.xml | 3 ++ .../main/java/org/lsposed/patch/LSPatch.java | 21 ++++++---- 8 files changed, 67 insertions(+), 8 deletions(-) diff --git a/manager/src/main/java/org/lsposed/lspatch/Patcher.kt b/manager/src/main/java/org/lsposed/lspatch/Patcher.kt index 1bf2d64ed..e9937ae2f 100644 --- a/manager/src/main/java/org/lsposed/lspatch/Patcher.kt +++ b/manager/src/main/java/org/lsposed/lspatch/Patcher.kt @@ -15,6 +15,7 @@ import java.io.IOException object Patcher { class Options( + private val dexMod: Int, private val config: PatchConfig, private val apkPaths: List, private val embeddedModules: List? @@ -31,6 +32,7 @@ object Patcher { embeddedModules?.forEach { add("-m"); add(it) } + add("-dex"); add(dexMod.toString()) if (!MyKeyStore.useDefault) { addAll(arrayOf("-k", MyKeyStore.file.path, Configs.keyStorePassword, Configs.keyStoreAlias, Configs.keyStoreAliasPassword)) } 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 3c8473d8f..2e329b74b 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 @@ -278,6 +278,13 @@ private fun sigBypassLvStr(level: Int) = when (level) { else -> throw IllegalArgumentException("Invalid sigBypassLv: $level") } +@Composable +private fun dexModLvStr(level: Int) = when (level) { + 0 -> stringResource(R.string.patch_dex_modlv0) + 1 -> stringResource(R.string.patch_dex_modlv1) + else -> throw IllegalArgumentException("Invalid dexModLv: $level") +} + @Composable private fun PatchOptionsBody(modifier: Modifier, onAddEmbed: () -> Unit) { val viewModel = viewModel() @@ -365,6 +372,37 @@ private fun PatchOptionsBody(modifier: Modifier, onAddEmbed: () -> Unit) { ) } } + var dexModExpanded by remember { mutableStateOf(false) } + AnywhereDropdown( + expanded = dexModExpanded, + onDismissRequest = { dexModExpanded = false }, + onClick = { dexModExpanded = true }, + surface = { + SettingsItem( + icon = Icons.Outlined.Code, + title = stringResource(R.string.patch_dex_mod), + desc = dexModLvStr(viewModel.dexMod) + ) + } + ) { + repeat(2) { + DropdownMenuItem( + text = { + Row(verticalAlignment = Alignment.CenterVertically) { + RadioButton( + selected = viewModel.dexMod == it, + onClick = { viewModel.dexMod = it }) + Text(dexModLvStr(it)) + } + }, + onClick = { + viewModel.dexMod = it + dexModExpanded = false + } + ) + } + + } } } diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt index d170a91d8..69548e469 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt @@ -2,6 +2,7 @@ package org.lsposed.lspatch.ui.viewmodel import android.util.Log import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue @@ -38,6 +39,7 @@ class NewPatchViewModel : ViewModel() { var debuggable by mutableStateOf(false) var overrideVersionCode by mutableStateOf(false) var sigBypassLevel by mutableStateOf(2) + var dexMod by mutableIntStateOf(0) var embeddedModules = emptyList() lateinit var patchApp: AppInfo @@ -90,6 +92,7 @@ class NewPatchViewModel : ViewModel() { Log.d(TAG, "Submit patch") if (useManager) embeddedModules = emptyList() patchOptions = Patcher.Options( + dexMod = dexMod, config = PatchConfig(useManager, debuggable, overrideVersionCode, sigBypassLevel, null, null), apkPaths = listOf(patchApp.app.sourceDir) + (patchApp.app.splitSourceDirs ?: emptyArray()), embeddedModules = embeddedModules.flatMap { listOf(it.app.sourceDir) + (it.app.splitSourceDirs ?: emptyArray()) } 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 7645791f9..e6e36e7e3 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 @@ -117,7 +117,7 @@ class AppManageViewModel : ViewModel() { } } } - Patcher.patch(logger, Patcher.Options(config, patchPaths, embeddedModulePaths)) + Patcher.patch(logger, Patcher.Options(0, config, patchPaths, embeddedModulePaths)) val (status, message) = LSPPackageManager.install() if (status != PackageInstaller.STATUS_SUCCESS) throw RuntimeException(message) } diff --git a/manager/src/main/res/values-zh-rCN/strings.xml b/manager/src/main/res/values-zh-rCN/strings.xml index 429971f18..a005565e9 100644 --- a/manager/src/main/res/values-zh-rCN/strings.xml +++ b/manager/src/main/res/values-zh-rCN/strings.xml @@ -86,4 +86,7 @@ 别名错误 别名密码错误 详细修补日志 + Dex 模式 + 模式0: 清除 DEX + 模式1: 附加 DEX diff --git a/manager/src/main/res/values-zh-rTW/strings.xml b/manager/src/main/res/values-zh-rTW/strings.xml index 36f9782e9..81c31b757 100644 --- a/manager/src/main/res/values-zh-rTW/strings.xml +++ b/manager/src/main/res/values-zh-rTW/strings.xml @@ -86,4 +86,7 @@ 別名錯誤 別名密碼錯誤 詳細打包日誌 + Dex 模式 + 模式0: 清除 DEX + 模式1: 附加 DEX diff --git a/manager/src/main/res/values/strings.xml b/manager/src/main/res/values/strings.xml index 40e0f35e1..cdb08f5da 100644 --- a/manager/src/main/res/values/strings.xml +++ b/manager/src/main/res/values/strings.xml @@ -90,4 +90,7 @@ Wrong alias name Wrong alias password Detail patch logs + Dex Mod + mod0: Clear DEX + mod1: Append DEX diff --git a/patch/src/main/java/org/lsposed/patch/LSPatch.java b/patch/src/main/java/org/lsposed/patch/LSPatch.java index 37e51ab2c..816a4bd98 100644 --- a/patch/src/main/java/org/lsposed/patch/LSPatch.java +++ b/patch/src/main/java/org/lsposed/patch/LSPatch.java @@ -46,7 +46,6 @@ import java.util.List; import java.util.Locale; import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; public class LSPatch { @@ -79,6 +78,9 @@ public PatchError(String message, Throwable cause) { @Parameter(names = {"-l", "--sigbypasslv"}, description = "Signature bypass level. 0 (disable), 1 (pm), 2 (pm+openat). default 0") private int sigbypassLevel = 0; + @Parameter(names = {"-dex", "--dexmod"}, description = "Use dex mode. 0(clear-dex), 1(append-dex), default 0") + private int dexMode = 0; + @Parameter(names = {"-k", "--keystore"}, arity = 4, description = "Set custom signature keystore. Followed by 4 arguments: keystore path, keystore password, keystore alias, keystore alias password") private List keystoreArgs = Arrays.asList(null, "123456", "key0", "123456"); @@ -208,7 +210,7 @@ public void patch(File srcApkFile, File outputFile) throws PatchError, IOExcepti String originalSignature = null; if (sigbypassLevel > 0) { - originalSignature = ApkSignatureHelper.getApkSignInfo(srcApkFile.getAbsolutePath()); + originalSignature = ApkSignatureHelper.getApkSignInfo(srcApkFile.getAbsolutePath()); if (originalSignature == null || originalSignature.isEmpty()) { throw new PatchError("get original signature failed"); } @@ -266,11 +268,15 @@ public void patch(File srcApkFile, File outputFile) throws PatchError, IOExcepti logger.i("Adding metaloader dex..."); try (var is = getClass().getClassLoader().getResourceAsStream(Constants.META_LOADER_DEX_ASSET_PATH)) { - var dexCount = srcZFile.entries().stream().filter(entry -> { - var name = entry.getCentralDirectoryHeader().getName(); - return name.startsWith("classes") && name.endsWith(".dex"); - }).collect(Collectors.toList()).size() + 1; - dstZFile.add("classes" + dexCount + ".dex", is); + if (dexMode == 0) { + dstZFile.add("classes.dex", is); + } else { + var dexCount = srcZFile.entries().stream().filter(entry -> { + var name = entry.getCentralDirectoryHeader().getName(); + return name.startsWith("classes") && name.endsWith(".dex"); + }).collect(Collectors.toList()).size() + 1; + dstZFile.add("classes" + dexCount + ".dex", is); + } } catch (Throwable e) { throw new PatchError("Error when adding dex", e); } @@ -307,6 +313,7 @@ public void patch(File srcApkFile, File outputFile) throws PatchError, IOExcepti for (StoredEntry entry : srcZFile.entries()) { String name = entry.getCentralDirectoryHeader().getName(); if (dstZFile.get(name) != null) continue; + if (dexMode == 0 && name.startsWith("classes") && name.endsWith(".dex")) continue; if (name.equals("AndroidManifest.xml")) continue; if (name.startsWith("META-INF") && (name.endsWith(".SF") || name.endsWith(".MF") || name.endsWith(".RSA"))) continue; srcZFile.addFileLink(name, name); From c8219c78631cc1668a61e30e78c87a66306a6733 Mon Sep 17 00:00:00 2001 From: xihan123 Date: Sun, 10 Nov 2024 17:54:50 +0800 Subject: [PATCH 6/9] Update JingMatrix/LSPosed --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 1db3217d2..6575c443f 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 1db3217d2e7b0986b0ad1f0e7581601c759a39c0 +Subproject commit 6575c443f09693244a72e5cd5dcf41f6cba0f9a2 From 99ff1325a1dca1dea7ed8a0a59dd97927d5624b1 Mon Sep 17 00:00:00 2001 From: xihan123 Date: Mon, 11 Nov 2024 00:06:07 +0800 Subject: [PATCH 7/9] =?UTF-8?q?feat(patch):=20=E4=BF=AE=E6=94=B9=20Dex=20?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 Dex 模式选项,改为直接注入 loader Dex 文件 - 更新相关 UI 和字符串资源 - 修改 NewPatchViewModel 中的 dexMod 属性类型 --- .../lsposed/lspatch/ui/page/NewPatchScreen.kt | 47 ++++--------------- .../lspatch/ui/viewmodel/NewPatchViewModel.kt | 4 +- .../src/main/res/values-zh-rCN/strings.xml | 5 +- .../src/main/res/values-zh-rTW/strings.xml | 5 +- manager/src/main/res/values/strings.xml | 5 +- .../main/java/org/lsposed/patch/LSPatch.java | 2 +- 6 files changed, 18 insertions(+), 50 deletions(-) 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 2e329b74b..a80653239 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 @@ -278,13 +278,6 @@ private fun sigBypassLvStr(level: Int) = when (level) { else -> throw IllegalArgumentException("Invalid sigBypassLv: $level") } -@Composable -private fun dexModLvStr(level: Int) = when (level) { - 0 -> stringResource(R.string.patch_dex_modlv0) - 1 -> stringResource(R.string.patch_dex_modlv1) - else -> throw IllegalArgumentException("Invalid dexModLv: $level") -} - @Composable private fun PatchOptionsBody(modifier: Modifier, onAddEmbed: () -> Unit) { val viewModel = viewModel() @@ -344,6 +337,15 @@ private fun PatchOptionsBody(modifier: Modifier, onAddEmbed: () -> Unit) { title = stringResource(R.string.patch_override_version_code), desc = stringResource(R.string.patch_override_version_code_desc) ) + + SettingsCheckBox( + modifier = Modifier.clickable { viewModel.dexMod = !viewModel.dexMod }, + checked = viewModel.dexMod, + icon = Icons.Outlined.Code, + title = stringResource(R.string.patch_dex_mod), + desc = stringResource(R.string.patch_dex_desc) + ) + var bypassExpanded by remember { mutableStateOf(false) } AnywhereDropdown( expanded = bypassExpanded, @@ -372,37 +374,6 @@ private fun PatchOptionsBody(modifier: Modifier, onAddEmbed: () -> Unit) { ) } } - var dexModExpanded by remember { mutableStateOf(false) } - AnywhereDropdown( - expanded = dexModExpanded, - onDismissRequest = { dexModExpanded = false }, - onClick = { dexModExpanded = true }, - surface = { - SettingsItem( - icon = Icons.Outlined.Code, - title = stringResource(R.string.patch_dex_mod), - desc = dexModLvStr(viewModel.dexMod) - ) - } - ) { - repeat(2) { - DropdownMenuItem( - text = { - Row(verticalAlignment = Alignment.CenterVertically) { - RadioButton( - selected = viewModel.dexMod == it, - onClick = { viewModel.dexMod = it }) - Text(dexModLvStr(it)) - } - }, - onClick = { - viewModel.dexMod = it - dexModExpanded = false - } - ) - } - - } } } diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt index 69548e469..c3f4552e7 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt @@ -39,7 +39,7 @@ class NewPatchViewModel : ViewModel() { var debuggable by mutableStateOf(false) var overrideVersionCode by mutableStateOf(false) var sigBypassLevel by mutableStateOf(2) - var dexMod by mutableIntStateOf(0) + var dexMod by mutableStateOf(false) var embeddedModules = emptyList() lateinit var patchApp: AppInfo @@ -92,7 +92,7 @@ class NewPatchViewModel : ViewModel() { Log.d(TAG, "Submit patch") if (useManager) embeddedModules = emptyList() patchOptions = Patcher.Options( - dexMod = dexMod, + dexMod = if (dexMod) 1 else 0, config = PatchConfig(useManager, debuggable, overrideVersionCode, sigBypassLevel, null, null), apkPaths = listOf(patchApp.app.sourceDir) + (patchApp.app.splitSourceDirs ?: emptyArray()), embeddedModules = embeddedModules.flatMap { listOf(it.app.sourceDir) + (it.app.splitSourceDirs ?: emptyArray()) } diff --git a/manager/src/main/res/values-zh-rCN/strings.xml b/manager/src/main/res/values-zh-rCN/strings.xml index a005565e9..4e022ca5a 100644 --- a/manager/src/main/res/values-zh-rCN/strings.xml +++ b/manager/src/main/res/values-zh-rCN/strings.xml @@ -86,7 +86,6 @@ 别名错误 别名密码错误 详细修补日志 - Dex 模式 - 模式0: 清除 DEX - 模式1: 附加 DEX + 注入加载器 Dex + 对那些需要孤立服务进程的应用程序,譬如说浏览器的渲染引擎,请勾选此选项以确保他们正常运行 diff --git a/manager/src/main/res/values-zh-rTW/strings.xml b/manager/src/main/res/values-zh-rTW/strings.xml index 81c31b757..e3ddd9ad7 100644 --- a/manager/src/main/res/values-zh-rTW/strings.xml +++ b/manager/src/main/res/values-zh-rTW/strings.xml @@ -86,7 +86,6 @@ 別名錯誤 別名密碼錯誤 詳細打包日誌 - Dex 模式 - 模式0: 清除 DEX - 模式1: 附加 DEX + 注入加載器 Dex + 對那些需要孤立服務進程的應用程序,譬如說瀏覽器的渲染引擎,請勾選此選項以確保他們正常運行 diff --git a/manager/src/main/res/values/strings.xml b/manager/src/main/res/values/strings.xml index cdb08f5da..a2cdfed11 100644 --- a/manager/src/main/res/values/strings.xml +++ b/manager/src/main/res/values/strings.xml @@ -90,7 +90,6 @@ Wrong alias name Wrong alias password Detail patch logs - Dex Mod - mod0: Clear DEX - mod1: Append DEX + Inject loader dex + For applications with isolated services, such as the render engines of browsers, please turn on option to ensure that they work properly. diff --git a/patch/src/main/java/org/lsposed/patch/LSPatch.java b/patch/src/main/java/org/lsposed/patch/LSPatch.java index 816a4bd98..5a004a14c 100644 --- a/patch/src/main/java/org/lsposed/patch/LSPatch.java +++ b/patch/src/main/java/org/lsposed/patch/LSPatch.java @@ -78,7 +78,7 @@ public PatchError(String message, Throwable cause) { @Parameter(names = {"-l", "--sigbypasslv"}, description = "Signature bypass level. 0 (disable), 1 (pm), 2 (pm+openat). default 0") private int sigbypassLevel = 0; - @Parameter(names = {"-dex", "--dexmod"}, description = "Use dex mode. 0(clear-dex), 1(append-dex), default 0") + @Parameter(names = {"-dex", "--dexmod"}, description = "Inject directly the loder dex file into the original application package, default 0") private int dexMode = 0; @Parameter(names = {"-k", "--keystore"}, arity = 4, description = "Set custom signature keystore. Followed by 4 arguments: keystore path, keystore password, keystore alias, keystore alias password") From 351345354bcf54a9e8e8a7655a1ac8520ee19d03 Mon Sep 17 00:00:00 2001 From: xihan123 Date: Sat, 16 Nov 2024 12:02:02 +0800 Subject: [PATCH 8/9] refactor(Patcher): Change the dexMod argument from Int to Boolean --- .../src/main/java/org/lsposed/lspatch/Patcher.kt | 5 +++-- .../lspatch/ui/viewmodel/NewPatchViewModel.kt | 2 +- .../ui/viewmodel/manage/AppManageViewModel.kt | 2 +- patch/src/main/java/org/lsposed/patch/LSPatch.java | 14 ++++++++------ 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manager/src/main/java/org/lsposed/lspatch/Patcher.kt b/manager/src/main/java/org/lsposed/lspatch/Patcher.kt index e9937ae2f..af02647e6 100644 --- a/manager/src/main/java/org/lsposed/lspatch/Patcher.kt +++ b/manager/src/main/java/org/lsposed/lspatch/Patcher.kt @@ -11,11 +11,12 @@ import org.lsposed.lspatch.share.PatchConfig import org.lsposed.patch.LSPatch import org.lsposed.patch.util.Logger import java.io.IOException +import java.util.Collections.addAll object Patcher { class Options( - private val dexMod: Int, + private val dexMod: Boolean, private val config: PatchConfig, private val apkPaths: List, private val embeddedModules: List? @@ -32,7 +33,7 @@ object Patcher { embeddedModules?.forEach { add("-m"); add(it) } - add("-dex"); add(dexMod.toString()) + if(dexMod) add("-dex") if (!MyKeyStore.useDefault) { addAll(arrayOf("-k", MyKeyStore.file.path, Configs.keyStorePassword, Configs.keyStoreAlias, Configs.keyStoreAliasPassword)) } diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt index c3f4552e7..7fae2fe63 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt @@ -92,7 +92,7 @@ class NewPatchViewModel : ViewModel() { Log.d(TAG, "Submit patch") if (useManager) embeddedModules = emptyList() patchOptions = Patcher.Options( - dexMod = if (dexMod) 1 else 0, + dexMod = dexMod, config = PatchConfig(useManager, debuggable, overrideVersionCode, sigBypassLevel, null, null), apkPaths = listOf(patchApp.app.sourceDir) + (patchApp.app.splitSourceDirs ?: emptyArray()), embeddedModules = embeddedModules.flatMap { listOf(it.app.sourceDir) + (it.app.splitSourceDirs ?: emptyArray()) } 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 e6e36e7e3..51da66e3c 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 @@ -117,7 +117,7 @@ class AppManageViewModel : ViewModel() { } } } - Patcher.patch(logger, Patcher.Options(0, config, patchPaths, embeddedModulePaths)) + Patcher.patch(logger, Patcher.Options(false, config, patchPaths, embeddedModulePaths)) val (status, message) = LSPPackageManager.install() if (status != PackageInstaller.STATUS_SUCCESS) throw RuntimeException(message) } diff --git a/patch/src/main/java/org/lsposed/patch/LSPatch.java b/patch/src/main/java/org/lsposed/patch/LSPatch.java index 5a004a14c..a3c69e076 100644 --- a/patch/src/main/java/org/lsposed/patch/LSPatch.java +++ b/patch/src/main/java/org/lsposed/patch/LSPatch.java @@ -78,8 +78,8 @@ public PatchError(String message, Throwable cause) { @Parameter(names = {"-l", "--sigbypasslv"}, description = "Signature bypass level. 0 (disable), 1 (pm), 2 (pm+openat). default 0") private int sigbypassLevel = 0; - @Parameter(names = {"-dex", "--dexmod"}, description = "Inject directly the loder dex file into the original application package, default 0") - private int dexMode = 0; + @Parameter(names = {"-dex", "--dexmod"}, description = "Inject directly the loder dex file into the original application package") + private boolean dexMode = false; @Parameter(names = {"-k", "--keystore"}, arity = 4, description = "Set custom signature keystore. Followed by 4 arguments: keystore path, keystore password, keystore alias, keystore alias password") private List keystoreArgs = Arrays.asList(null, "123456", "key0", "123456"); @@ -241,7 +241,8 @@ public void patch(File srcApkFile, File outputFile) throws PatchError, IOExcepti for (StoredEntry entry : srcZFile.entries()) { String name = entry.getCentralDirectoryHeader().getName(); if (dstZFile.get(name) != null) continue; - if (name.startsWith("META-INF") && (name.endsWith(".SF") || name.endsWith(".MF") || name.endsWith(".RSA"))) continue; + if (name.startsWith("META-INF") && (name.endsWith(".SF") || name.endsWith(".MF") || name.endsWith(".RSA"))) + continue; srcZFile.addFileLink(name, name); } return; @@ -268,7 +269,7 @@ public void patch(File srcApkFile, File outputFile) throws PatchError, IOExcepti logger.i("Adding metaloader dex..."); try (var is = getClass().getClassLoader().getResourceAsStream(Constants.META_LOADER_DEX_ASSET_PATH)) { - if (dexMode == 0) { + if (!dexMode) { dstZFile.add("classes.dex", is); } else { var dexCount = srcZFile.entries().stream().filter(entry -> { @@ -313,9 +314,10 @@ public void patch(File srcApkFile, File outputFile) throws PatchError, IOExcepti for (StoredEntry entry : srcZFile.entries()) { String name = entry.getCentralDirectoryHeader().getName(); if (dstZFile.get(name) != null) continue; - if (dexMode == 0 && name.startsWith("classes") && name.endsWith(".dex")) continue; + if (!dexMode && name.startsWith("classes") && name.endsWith(".dex")) continue; if (name.equals("AndroidManifest.xml")) continue; - if (name.startsWith("META-INF") && (name.endsWith(".SF") || name.endsWith(".MF") || name.endsWith(".RSA"))) continue; + if (name.startsWith("META-INF") && (name.endsWith(".SF") || name.endsWith(".MF") || name.endsWith(".RSA"))) + continue; srcZFile.addFileLink(name, name); } From 5f1f1f79c3547be73122fba4cd18d0ed4e89906c Mon Sep 17 00:00:00 2001 From: xihan123 Date: Wed, 20 Nov 2024 20:35:56 +0800 Subject: [PATCH 9/9] refactor(patch): Rename the Dex injection option and update the associated code - rename the --dexmod argument to --injectdex - Update related variables in the LSPatch, NewPatchScreen, NewPatchViewModel, and Patcher classes - Modify the description in the string resource file --- manager/src/main/java/org/lsposed/lspatch/Patcher.kt | 4 ++-- .../org/lsposed/lspatch/ui/page/NewPatchScreen.kt | 8 ++++---- .../lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt | 5 ++--- manager/src/main/res/values-zh-rCN/strings.xml | 4 ++-- manager/src/main/res/values-zh-rTW/strings.xml | 4 ++-- manager/src/main/res/values/strings.xml | 4 ++-- patch/src/main/java/org/lsposed/patch/LSPatch.java | 11 +++++------ 7 files changed, 19 insertions(+), 21 deletions(-) diff --git a/manager/src/main/java/org/lsposed/lspatch/Patcher.kt b/manager/src/main/java/org/lsposed/lspatch/Patcher.kt index af02647e6..15e6d3544 100644 --- a/manager/src/main/java/org/lsposed/lspatch/Patcher.kt +++ b/manager/src/main/java/org/lsposed/lspatch/Patcher.kt @@ -16,7 +16,7 @@ import java.util.Collections.addAll object Patcher { class Options( - private val dexMod: Boolean, + private val injectDex: Boolean, private val config: PatchConfig, private val apkPaths: List, private val embeddedModules: List? @@ -33,7 +33,7 @@ object Patcher { embeddedModules?.forEach { add("-m"); add(it) } - if(dexMod) add("-dex") + if(injectDex) add("--injectdex") if (!MyKeyStore.useDefault) { addAll(arrayOf("-k", MyKeyStore.file.path, Configs.keyStorePassword, Configs.keyStoreAlias, Configs.keyStoreAliasPassword)) } 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 a80653239..a1dc27ef4 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 @@ -339,11 +339,11 @@ private fun PatchOptionsBody(modifier: Modifier, onAddEmbed: () -> Unit) { ) SettingsCheckBox( - modifier = Modifier.clickable { viewModel.dexMod = !viewModel.dexMod }, - checked = viewModel.dexMod, + modifier = Modifier.clickable { viewModel.injectDex = !viewModel.injectDex }, + checked = viewModel.injectDex, icon = Icons.Outlined.Code, - title = stringResource(R.string.patch_dex_mod), - desc = stringResource(R.string.patch_dex_desc) + title = stringResource(R.string.patch_inject_dex), + desc = stringResource(R.string.patch_inject_dex_desc) ) var bypassExpanded by remember { mutableStateOf(false) } diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt index 7fae2fe63..be17f4b57 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt @@ -2,7 +2,6 @@ package org.lsposed.lspatch.ui.viewmodel import android.util.Log import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue @@ -39,7 +38,7 @@ class NewPatchViewModel : ViewModel() { var debuggable by mutableStateOf(false) var overrideVersionCode by mutableStateOf(false) var sigBypassLevel by mutableStateOf(2) - var dexMod by mutableStateOf(false) + var injectDex by mutableStateOf(false) var embeddedModules = emptyList() lateinit var patchApp: AppInfo @@ -92,7 +91,7 @@ class NewPatchViewModel : ViewModel() { Log.d(TAG, "Submit patch") if (useManager) embeddedModules = emptyList() patchOptions = Patcher.Options( - dexMod = dexMod, + injectDex = injectDex, config = PatchConfig(useManager, debuggable, overrideVersionCode, sigBypassLevel, null, null), apkPaths = listOf(patchApp.app.sourceDir) + (patchApp.app.splitSourceDirs ?: emptyArray()), embeddedModules = embeddedModules.flatMap { listOf(it.app.sourceDir) + (it.app.splitSourceDirs ?: emptyArray()) } diff --git a/manager/src/main/res/values-zh-rCN/strings.xml b/manager/src/main/res/values-zh-rCN/strings.xml index 4e022ca5a..fa115e031 100644 --- a/manager/src/main/res/values-zh-rCN/strings.xml +++ b/manager/src/main/res/values-zh-rCN/strings.xml @@ -86,6 +86,6 @@ 别名错误 别名密码错误 详细修补日志 - 注入加载器 Dex - 对那些需要孤立服务进程的应用程序,譬如说浏览器的渲染引擎,请勾选此选项以确保他们正常运行 + 注入加载器 Dex + 对那些需要孤立服务进程的应用程序,譬如说浏览器的渲染引擎,请勾选此选项以确保他们正常运行 diff --git a/manager/src/main/res/values-zh-rTW/strings.xml b/manager/src/main/res/values-zh-rTW/strings.xml index e3ddd9ad7..0ad886b8e 100644 --- a/manager/src/main/res/values-zh-rTW/strings.xml +++ b/manager/src/main/res/values-zh-rTW/strings.xml @@ -86,6 +86,6 @@ 別名錯誤 別名密碼錯誤 詳細打包日誌 - 注入加載器 Dex - 對那些需要孤立服務進程的應用程序,譬如說瀏覽器的渲染引擎,請勾選此選項以確保他們正常運行 + 注入加載器 Dex + 對那些需要孤立服務進程的應用程序,譬如說瀏覽器的渲染引擎,請勾選此選項以確保他們正常運行 diff --git a/manager/src/main/res/values/strings.xml b/manager/src/main/res/values/strings.xml index a2cdfed11..27393557a 100644 --- a/manager/src/main/res/values/strings.xml +++ b/manager/src/main/res/values/strings.xml @@ -90,6 +90,6 @@ Wrong alias name Wrong alias password Detail patch logs - Inject loader dex - For applications with isolated services, such as the render engines of browsers, please turn on option to ensure that they work properly. + Inject loader dex + For applications with isolated services, such as the render engines of browsers, please turn on this option to ensure that they work properly. diff --git a/patch/src/main/java/org/lsposed/patch/LSPatch.java b/patch/src/main/java/org/lsposed/patch/LSPatch.java index a3c69e076..c7907a84d 100644 --- a/patch/src/main/java/org/lsposed/patch/LSPatch.java +++ b/patch/src/main/java/org/lsposed/patch/LSPatch.java @@ -78,8 +78,8 @@ public PatchError(String message, Throwable cause) { @Parameter(names = {"-l", "--sigbypasslv"}, description = "Signature bypass level. 0 (disable), 1 (pm), 2 (pm+openat). default 0") private int sigbypassLevel = 0; - @Parameter(names = {"-dex", "--dexmod"}, description = "Inject directly the loder dex file into the original application package") - private boolean dexMode = false; + @Parameter(names = {"--injectdex"}, description = "Inject directly the loder dex file into the original application package") + private boolean injectDex = false; @Parameter(names = {"-k", "--keystore"}, arity = 4, description = "Set custom signature keystore. Followed by 4 arguments: keystore path, keystore password, keystore alias, keystore alias password") private List keystoreArgs = Arrays.asList(null, "123456", "key0", "123456"); @@ -269,7 +269,7 @@ public void patch(File srcApkFile, File outputFile) throws PatchError, IOExcepti logger.i("Adding metaloader dex..."); try (var is = getClass().getClassLoader().getResourceAsStream(Constants.META_LOADER_DEX_ASSET_PATH)) { - if (!dexMode) { + if (!injectDex) { dstZFile.add("classes.dex", is); } else { var dexCount = srcZFile.entries().stream().filter(entry -> { @@ -314,10 +314,9 @@ public void patch(File srcApkFile, File outputFile) throws PatchError, IOExcepti for (StoredEntry entry : srcZFile.entries()) { String name = entry.getCentralDirectoryHeader().getName(); if (dstZFile.get(name) != null) continue; - if (!dexMode && name.startsWith("classes") && name.endsWith(".dex")) continue; + if (!injectDex && name.startsWith("classes") && name.endsWith(".dex")) continue; if (name.equals("AndroidManifest.xml")) continue; - if (name.startsWith("META-INF") && (name.endsWith(".SF") || name.endsWith(".MF") || name.endsWith(".RSA"))) - continue; + if (name.startsWith("META-INF") && (name.endsWith(".SF") || name.endsWith(".MF") || name.endsWith(".RSA"))) continue; srcZFile.addFileLink(name, name); }