From 012110f00868c3f87e934397ceddbb6cc8b068f8 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Tue, 3 Oct 2023 18:54:51 +0200 Subject: [PATCH] perf: Do not load patches twice --- .../revanced/manager/flutter/MainActivity.kt | 35 +++++++++---------- lib/services/patcher_api.dart | 16 ++++----- .../views/installer/installer_viewmodel.dart | 2 ++ 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt b/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt index 691267b3..76ca3c66 100644 --- a/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt +++ b/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt @@ -8,6 +8,7 @@ import app.revanced.manager.flutter.utils.signing.Signer import app.revanced.manager.flutter.utils.zip.ZipFile import app.revanced.manager.flutter.utils.zip.structures.ZipEntry import app.revanced.patcher.PatchBundleLoader +import app.revanced.patcher.PatchSet import app.revanced.patcher.Patcher import app.revanced.patcher.PatcherOptions import app.revanced.patcher.patch.PatchResult @@ -31,6 +32,8 @@ class MainActivity : FlutterActivity() { private var cancel: Boolean = false private var stopResult: MethodChannel.Result? = null + private lateinit var patches: PatchSet + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) @@ -46,7 +49,6 @@ class MainActivity : FlutterActivity() { mainChannel.setMethodCallHandler { call, result -> when (call.method) { "runPatcher" -> { - val patchBundleFilePath = call.argument("patchBundleFilePath") val originalFilePath = call.argument("originalFilePath") val inputFilePath = call.argument("inputFilePath") val patchedFilePath = call.argument("patchedFilePath") @@ -57,7 +59,7 @@ class MainActivity : FlutterActivity() { val keyStoreFilePath = call.argument("keyStoreFilePath") val keystorePassword = call.argument("keystorePassword") - if (patchBundleFilePath != null && + if ( originalFilePath != null && inputFilePath != null && patchedFilePath != null && @@ -71,7 +73,6 @@ class MainActivity : FlutterActivity() { cancel = false runPatcher( result, - patchBundleFilePath, originalFilePath, inputFilePath, patchedFilePath, @@ -94,17 +95,19 @@ class MainActivity : FlutterActivity() { val patchBundleFilePath = call.argument("patchBundleFilePath")!! val cacheDirPath = call.argument("cacheDirPath")!! + try { + patches = PatchBundleLoader.Dex( + File(patchBundleFilePath), + optimizedDexDirectory = File(cacheDirPath) + ) + } catch (ex: Exception) { + return@setMethodCallHandler result.notImplemented() + } catch (err: Error) { + return@setMethodCallHandler result.notImplemented() + } + JSONArray().apply { - try { - PatchBundleLoader.Dex( - File(patchBundleFilePath), - optimizedDexDirectory = File(cacheDirPath) - ) - } catch (ex: Exception) { - return@setMethodCallHandler result.notImplemented() - } catch (err: Error) { - return@setMethodCallHandler result.notImplemented() - }.forEach { + patches.forEach { JSONObject().apply { put("name", it.name) put("description", it.description) @@ -136,7 +139,6 @@ class MainActivity : FlutterActivity() { private fun runPatcher( result: MethodChannel.Result, - patchBundleFilePath: String, originalFilePath: String, inputFilePath: String, patchedFilePath: String, @@ -223,10 +225,7 @@ class MainActivity : FlutterActivity() { updateProgress(0.1, "Loading patches...", "Loading patches") - val patches = PatchBundleLoader.Dex( - File(patchBundleFilePath), - optimizedDexDirectory = cacheDir - ).filter { patch -> + val patches = patches.filter { patch -> val isCompatible = patch.compatiblePackages?.any { it.name == patcher.context.packageMetadata.packageName } ?: false diff --git a/lib/services/patcher_api.dart b/lib/services/patcher_api.dart index 9a094bec..f6c8aa3e 100644 --- a/lib/services/patcher_api.dart +++ b/lib/services/patcher_api.dart @@ -59,9 +59,7 @@ class PatcherAPI { } List getUniversalPatches() { - return _patches - .where((patch) => patch.compatiblePackages.isEmpty) - .toList(); + return _patches.where((patch) => patch.compatiblePackages.isEmpty).toList(); } Future _loadPatches() async { @@ -85,15 +83,14 @@ class PatcherAPI { ) async { final List filteredApps = []; final bool allAppsIncluded = - _universalPatches.isNotEmpty && - showUniversalPatches; + _universalPatches.isNotEmpty && showUniversalPatches; if (allAppsIncluded) { final appList = await DeviceApps.getInstalledApplications( includeAppIcons: true, onlyAppsWithLaunchIntent: true, ); - for(final app in appList) { + for (final app in appList) { filteredApps.add(app as ApplicationWithIcon); } } @@ -154,9 +151,9 @@ class PatcherAPI { String apkFilePath, List selectedPatches, ) async { - final File? patchBundleFile = await _managerAPI.downloadPatches(); final File? integrationsFile = await _managerAPI.downloadIntegrations(); - if (patchBundleFile != null) { + + if (integrationsFile != null) { _dataDir.createSync(); _tmpDir.createSync(); final Directory workDir = _tmpDir.createTempSync('tmp-'); @@ -170,12 +167,11 @@ class PatcherAPI { await patcherChannel.invokeMethod( 'runPatcher', { - 'patchBundleFilePath': patchBundleFile.path, 'originalFilePath': originalFilePath, 'inputFilePath': inputFile.path, 'patchedFilePath': patchedFile.path, 'outFilePath': outFile!.path, - 'integrationsPath': integrationsFile!.path, + 'integrationsPath': integrationsFile.path, 'selectedPatches': selectedPatches.map((p) => p.name).toList(), 'cacheDirPath': cacheDir.path, 'keyStoreFilePath': _keyStoreFile.path, diff --git a/lib/ui/views/installer/installer_viewmodel.dart b/lib/ui/views/installer/installer_viewmodel.dart index 137d2269..76a18f21 100644 --- a/lib/ui/views/installer/installer_viewmodel.dart +++ b/lib/ui/views/installer/installer_viewmodel.dart @@ -95,6 +95,8 @@ class InstallerViewModel extends BaseViewModel { isInstalled = false; hasErrors = false; } else if (value == 1.0) { + _managerAPI.patches.clear(); + isPatching = false; hasErrors = false; await _managerAPI.savePatches(