Skip to content

Commit 43f50ea

Browse files
authored
fix: Use patcher implementation of strip libs (MorpheApp#83)
Fixes MorpheApp#80 and supersedes MorpheApp#82
1 parent fa877d8 commit 43f50ea

8 files changed

Lines changed: 34 additions & 155 deletions

File tree

src/main/kotlin/app/morphe/cli/command/PatchCommand.kt

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import app.morphe.cli.command.model.mergeWith
1919
import app.morphe.cli.command.model.toPatchBundle
2020
import app.morphe.cli.command.model.toSerializablePatch
2121
import app.morphe.cli.command.model.withUpdatedBundle
22-
import app.morphe.engine.ApkLibraryStripper
2322
import app.morphe.engine.UpdateChecker
2423
import app.morphe.patcher.apk.ApkUtils
2524
import app.morphe.patcher.apk.ApkUtils.applyTo
@@ -31,6 +30,7 @@ import app.morphe.patcher.logging.toMorpheLogger
3130
import app.morphe.patcher.patch.Patch
3231
import app.morphe.patcher.patch.loadPatchesFromJar
3332
import app.morphe.patcher.patch.setOptions
33+
import app.morphe.patcher.resource.CpuArchitecture
3434
import kotlinx.coroutines.runBlocking
3535
import kotlinx.serialization.ExperimentalSerializationApi
3636
import kotlinx.serialization.json.Json
@@ -286,12 +286,26 @@ internal object PatchCommand : Callable<Int> {
286286
)
287287
private var unsigned: Boolean = false
288288

289+
private var keepArchitectures: Set<CpuArchitecture> = emptySet()
289290
@CommandLine.Option(
290291
names = ["--striplibs"],
291292
description = ["Architectures to keep, comma-separated (e.g. arm64-v8a,x86). Strips all other native architectures."],
292293
split = ",",
293294
)
294-
private var striplibs: List<String> = emptyList()
295+
@Suppress("unused")
296+
private fun setStripLibs(architectures: List<String>) {
297+
this.keepArchitectures = architectures.map { arch ->
298+
CpuArchitecture.valueOfOrNull(arch.trim())
299+
?: throw CommandLine.ParameterException(
300+
spec.commandLine(),
301+
"Invalid architecture \"$arch\" in --striplibs. Valid values are: ${
302+
CpuArchitecture.entries.joinToString(
303+
", "
304+
) { it.arch }
305+
}",
306+
)
307+
}.toSet()
308+
}
295309

296310
@CommandLine.Option(
297311
names = ["--continue-on-error"],
@@ -460,6 +474,7 @@ internal object PatchCommand : Callable<Int> {
460474
aaptBinaryPath?.path,
461475
patcherTemporaryFilesPath.absolutePath,
462476
if (aaptBinaryPath != null) { false } else { !forceApktool },
477+
keepArchitectures
463478
),
464479
).use { patcher ->
465480
val packageName = patcher.context.packageMetadata.packageName
@@ -646,17 +661,6 @@ internal object PatchCommand : Callable<Int> {
646661
patcherResult.applyTo(this)
647662
}
648663
)
649-
}.also { rebuiltApk ->
650-
if (striplibs.isNotEmpty()) {
651-
patchingResult.addStepResult(
652-
PatchingStep.STRIPPING_LIBS,
653-
{
654-
ApkLibraryStripper.stripLibraries(rebuiltApk, striplibs) { msg ->
655-
logger.info(msg)
656-
}
657-
}
658-
)
659-
}
660664
}.let { patchedApkFile ->
661665
if (!mount && !unsigned) {
662666
patchingResult.addStepResult(

src/main/kotlin/app/morphe/cli/command/model/PatchingStep.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package app.morphe.cli.command.model
33
enum class PatchingStep {
44
PATCHING,
55
REBUILDING,
6-
STRIPPING_LIBS,
76
SIGNING,
87
INSTALLING
98
}

src/main/kotlin/app/morphe/engine/ApkLibraryStripper.kt

Lines changed: 0 additions & 114 deletions
This file was deleted.

src/main/kotlin/app/morphe/engine/PatchEngine.kt

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import app.morphe.patcher.apk.ApkUtils.applyTo
1616
import app.morphe.patcher.logging.toMorpheLogger
1717
import app.morphe.patcher.patch.Patch
1818
import app.morphe.patcher.patch.setOptions
19+
import app.morphe.patcher.resource.CpuArchitecture
1920
import kotlinx.coroutines.Dispatchers
2021
import kotlinx.coroutines.currentCoroutineContext
2122
import kotlinx.coroutines.ensureActive
@@ -32,7 +33,7 @@ import java.util.logging.Logger
3233
object PatchEngine {
3334

3435
enum class PatchStep {
35-
PATCHING, REBUILDING, STRIPPING_LIBS, SIGNING
36+
PATCHING, REBUILDING, SIGNING
3637
}
3738

3839
data class StepResult(val step: PatchStep, val success: Boolean, val error: String? = null)
@@ -49,7 +50,7 @@ object PatchEngine {
4950
val unsigned: Boolean = false,
5051
val signerName: String = "Morphe",
5152
val keystoreDetails: ApkUtils.KeyStoreDetails? = null,
52-
val architecturesToKeep: List<String> = emptyList(),
53+
val architecturesToKeep: Set<CpuArchitecture> = emptySet(),
5354
val aaptBinaryPath: File? = null,
5455
val tempDir: File? = null,
5556
val failOnError: Boolean = true,
@@ -113,6 +114,8 @@ object PatchEngine {
113114
patcherTempDir,
114115
config.aaptBinaryPath?.path,
115116
patcherTempDir.absolutePath,
117+
useArsclib = true,
118+
keepArchitectures = config.architecturesToKeep
116119
)
117120

118121
Patcher(patcherConfig).use { patcher ->
@@ -207,23 +210,7 @@ object PatchEngine {
207210

208211
currentCoroutineContext().ensureActive()
209212

210-
// 7. Strip libs (if configured)
211-
if (config.architecturesToKeep.isNotEmpty()) {
212-
onProgress("Stripping native libraries...")
213-
try {
214-
ApkLibraryStripper.stripLibraries(rebuiltApk, config.architecturesToKeep) {
215-
onProgress(it)
216-
}
217-
stepResults.add(StepResult(PatchStep.STRIPPING_LIBS, true))
218-
} catch (e: Exception) {
219-
stepResults.add(StepResult(PatchStep.STRIPPING_LIBS, false, e.toString()))
220-
return earlyResult()
221-
}
222-
}
223-
224-
currentCoroutineContext().ensureActive()
225-
226-
// 8. Sign APK (unless unsigned)
213+
// 7. Sign APK (unless unsigned)
227214
val tempOutput = File(tempDir, config.outputApk.name)
228215
if (!config.unsigned) {
229216
onProgress("Signing APK...")
@@ -249,7 +236,7 @@ object PatchEngine {
249236
rebuiltApk.copyTo(tempOutput, overwrite = true)
250237
}
251238

252-
// 9. Copy to final output
239+
// 8. Copy to final output
253240
config.outputApk.parentFile?.mkdirs()
254241
tempOutput.copyTo(config.outputApk, overwrite = true)
255242

src/main/kotlin/app/morphe/gui/data/model/Patch.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package app.morphe.gui.data.model
77

8+
import app.morphe.patcher.resource.CpuArchitecture
89
import kotlinx.serialization.Serializable
910

1011
/**
@@ -85,6 +86,6 @@ data class PatchConfig(
8586
val disabledPatches: List<String> = emptyList(),
8687
val patchOptions: Map<String, String> = emptyMap(),
8788
val useExclusiveMode: Boolean = false,
88-
val striplibs: List<String> = emptyList(),
89+
val keepArchitectures: Set<CpuArchitecture> = emptySet(),
8990
val continueOnError: Boolean = false
9091
)

src/main/kotlin/app/morphe/gui/ui/screens/patches/PatchSelectionViewModel.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import kotlinx.coroutines.launch
1616
import app.morphe.gui.util.Logger
1717
import app.morphe.gui.util.PatchService
1818
import app.morphe.gui.data.repository.PatchRepository
19+
import app.morphe.patcher.resource.CpuArchitecture
1920
import java.io.File
2021

2122
class PatchSelectionViewModel(
@@ -199,9 +200,9 @@ class PatchSelectionViewModel(
199200

200201
// Only set riplibs if user deselected any architecture (keeps = selected ones)
201202
val striplibs = if (_uiState.value.selectedArchitectures.size < apkArchitectures.size && apkArchitectures.size > 1) {
202-
_uiState.value.selectedArchitectures.toList()
203+
_uiState.value.selectedArchitectures.map { CpuArchitecture.valueOf(it) }.toSet()
203204
} else {
204-
emptyList()
205+
emptySet()
205206
}
206207

207208
return PatchConfig(
@@ -211,7 +212,7 @@ class PatchSelectionViewModel(
211212
enabledPatches = selectedPatchNames,
212213
disabledPatches = disabledPatchNames,
213214
useExclusiveMode = true,
214-
striplibs = striplibs,
215+
keepArchitectures = striplibs,
215216
continueOnError = continueOnError
216217
)
217218
}

src/main/kotlin/app/morphe/gui/ui/screens/patching/PatchingScreenModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class PatchingScreenModel(
5959
disabledPatches = config.disabledPatches,
6060
options = config.patchOptions,
6161
exclusiveMode = config.useExclusiveMode,
62-
striplibs = config.striplibs,
62+
keepArchitectures = config.keepArchitectures,
6363
continueOnError = config.continueOnError,
6464
onProgress = { message ->
6565
parseAndAddLog(message)

src/main/kotlin/app/morphe/gui/util/PatchService.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import app.morphe.gui.data.model.Patch
1111
import app.morphe.gui.data.model.PatchOption
1212
import app.morphe.gui.data.model.PatchOptionType
1313
import app.morphe.patcher.patch.loadPatchesFromJar
14+
import app.morphe.patcher.resource.CpuArchitecture
1415
import kotlinx.coroutines.Dispatchers
1516
import kotlinx.coroutines.withContext
1617
import java.io.File
@@ -82,7 +83,7 @@ class PatchService {
8283
disabledPatches: List<String> = emptyList(),
8384
options: Map<String, String> = emptyMap(),
8485
exclusiveMode: Boolean = false,
85-
striplibs: List<String> = emptyList(),
86+
keepArchitectures: Set<CpuArchitecture> = emptySet(),
8687
continueOnError: Boolean = false,
8788
onProgress: (String) -> Unit = {}
8889
): Result<PatchResult> = withContext(Dispatchers.IO) {
@@ -122,7 +123,7 @@ class PatchService {
122123
exclusiveMode = exclusiveMode,
123124
forceCompatibility = true,
124125
patchOptions = patchOptions,
125-
architecturesToKeep = striplibs,
126+
architecturesToKeep = keepArchitectures,
126127
failOnError = !continueOnError,
127128
)
128129

0 commit comments

Comments
 (0)