feat: use separate command to uninstall

This commit is contained in:
oSumAtrIX 2023-08-22 23:35:02 +02:00
parent b74213f66e
commit c0cc909626
No known key found for this signature in database
GPG Key ID: A9B3094ACDB604B4
4 changed files with 74 additions and 31 deletions

View File

@ -41,6 +41,14 @@ Learn how to ReVanced CLI.
revanced-patches.jar revanced-patches.jar
``` ```
- ### ⚙️ Supply options to patches using ReVanced CLI
Some patches provide options. Currently, ReVanced CLI will generate and consume an `options.json` file at the location that is specified in `-o`. If the option is not specified, the options file will be generated in the current working directory.
The options file contains all options from supplied patch bundles.
> **Note**: The `options.json` file will be generated at the first time you use ReVanced CLI to patch an APK file for now. This will be changed in the future.
- ### 💉 Use ReVanced CLI to patch an APK file but deploy without root permissions - ### 💉 Use ReVanced CLI to patch an APK file but deploy without root permissions
This will deploy the patched APK file on your device by installing it. This will deploy the patched APK file on your device by installing it.
@ -50,7 +58,7 @@ Learn how to ReVanced CLI.
-a input.apk \ -a input.apk \
-o patched-output.apk \ -o patched-output.apk \
-b revanced-patches.jar \ -b revanced-patches.jar \
-d device-name -d device-serial
``` ```
- ### 👾 Use ReVanced CLI to patch an APK file but deploy with root permissions - ### 👾 Use ReVanced CLI to patch an APK file but deploy with root permissions
@ -64,16 +72,17 @@ Learn how to ReVanced CLI.
-o patched-output.apk \ -o patched-output.apk \
-b revanced-patches.jar \ -b revanced-patches.jar \
-e vanced-microg-support \ -e vanced-microg-support \
-d device-name \ -d device-serial \
--mount --mount
``` ```
> **Note**: Some patches from [ReVanced Patches](https://github.com/revanced/revanced-patches) also require [ReVanced Integrations](https://github.com/revanced/revanced-integrations). Supply them with the option `-m`. ReVanced Patcher will merge ReVanced Integrations automatically, depending on if the supplied patches require them. > **Note**: Some patches from [ReVanced Patches](https://github.com/revanced/revanced-patches) also require [ReVanced Integrations](https://github.com/revanced/revanced-integrations). Supply them with the option `-m`. ReVanced Patcher will merge ReVanced Integrations automatically, depending on if the supplied patches require them.
package
- ### ⚙️ Supply options to patches using ReVanced CLI - ### 🗑️ Uninstall a patched
```bash
Some patches provide options. Currently, ReVanced CLI will generate and consume an `options.json` file at the location that is specified in `-o`. If the option is not specified, the options file will be generated in the current working directory. java -jar revanced-cli.jar \
uninstall \
The options file contains all options from supplied patch bundles. -p package-name \
device-serial
> **Note**: The `options.json` file will be generated at the first time you use ReVanced CLI to patch an APK file for now. This will be changed in the future. ```

View File

@ -37,10 +37,10 @@ private class CLIVersionProvider : IVersionProvider {
description = ["Command line application to use ReVanced"], description = ["Command line application to use ReVanced"],
mixinStandardHelpOptions = true, mixinStandardHelpOptions = true,
versionProvider = CLIVersionProvider::class, versionProvider = CLIVersionProvider::class,
subcommands = [ListPatchesCommand::class] subcommands = [ListPatchesCommand::class, UninstallCommand::class]
) )
internal object MainCommand : Runnable { internal object MainCommand : Runnable {
val logger = DefaultCliLogger() internal val logger = DefaultCliLogger()
// @ArgGroup(exclusive = false, multiplicity = "1") // @ArgGroup(exclusive = false, multiplicity = "1")
lateinit var args: Args lateinit var args: Args
@ -145,11 +145,12 @@ internal object MainCommand : Runnable {
} }
} }
fun main(args: Array<String>) {
CommandLine(MainCommand).execute(*args)
}
override fun run() { override fun run() {
val patchArgs = args.patchArgs val patchArgs = args.patchArgs
if (args.packageName != null) return uninstall()
val patchingArgs = patchArgs?.patchingArgs ?: return val patchingArgs = patchArgs?.patchingArgs ?: return
if (!patchingArgs.inputFile.exists()) return logger.error("Input file ${patchingArgs.inputFile} does not exist.") if (!patchingArgs.inputFile.exists()) return logger.error("Input file ${patchingArgs.inputFile} does not exist.")
@ -241,18 +242,6 @@ internal object MainCommand : Runnable {
logger.info(result) logger.info(result)
} }
/**
* Uninstall the specified package from the specified device.
*
*/
private fun uninstall() = args.deviceSerial?.let { serial ->
if (args.mount) {
AdbManager.RootAdbManager(serial, logger)
} else {
AdbManager.UserAdbManager(serial, logger)
}.uninstall(args.packageName!!)
} ?: logger.error("No device serial specified")
private fun Patcher.filterPatchSelection(patches: PatchList) = buildList { private fun Patcher.filterPatchSelection(patches: PatchList) = buildList {
val packageName = context.packageMetadata.packageName val packageName = context.packageMetadata.packageName
val packageVersion = context.packageMetadata.packageVersion val packageVersion = context.packageMetadata.packageVersion
@ -326,8 +315,4 @@ internal object MainCommand : Runnable {
add(patch) add(patch)
} }
} }
fun main(args: Array<String>) {
CommandLine(MainCommand).execute(*args)
}
} }

View File

@ -0,0 +1,44 @@
package app.revanced.cli.command
import app.revanced.utils.adb.AdbManager
import picocli.CommandLine
import picocli.CommandLine.Help.Visibility.ALWAYS
@CommandLine.Command(
name = "uninstall",
description = ["Uninstall a patched package from the devices with the supplied ADB device serials"]
)
class UninstallCommand : Runnable {
@CommandLine.Parameters(
description = ["ADB device serials"],
arity = "1..*"
)
lateinit var deviceSerials: Array<String>
@CommandLine.Option(
names = ["-p", "--package-name"],
description = ["Package name to uninstall"],
required = true
)
lateinit var packageName: String
@CommandLine.Option(
names = ["-u", "--unmount"],
description = ["Uninstall by unmounting the patched package"],
showDefaultValue = ALWAYS
)
var unmount: Boolean = false
override fun run() = try {
deviceSerials.forEach {deviceSerial ->
if (unmount) {
AdbManager.RootAdbManager(deviceSerial, MainCommand.logger)
} else {
AdbManager.UserAdbManager(deviceSerial, MainCommand.logger)
}.uninstall(packageName)
}
} catch (e: AdbManager.DeviceNotFoundException) {
MainCommand.logger.error(e.toString())
}
}

View File

@ -27,7 +27,7 @@ import java.io.File
*/ */
internal sealed class AdbManager(deviceSerial: String? = null, protected val logger: CliLogger? = null) : Closeable { internal sealed class AdbManager(deviceSerial: String? = null, protected val logger: CliLogger? = null) : Closeable {
protected val device = JadbConnection().devices.find { device -> device.serial == deviceSerial } protected val device = JadbConnection().devices.find { device -> device.serial == deviceSerial }
?: throw IllegalArgumentException("The device with the serial $deviceSerial can not be found.") ?: throw DeviceNotFoundException(deviceSerial)
init { init {
logger?.trace("Established connection to $deviceSerial") logger?.trace("Established connection to $deviceSerial")
@ -127,4 +127,9 @@ internal sealed class AdbManager(deviceSerial: String? = null, protected val log
* @param file The [Apk] file. * @param file The [Apk] file.
*/ */
internal class Apk(val file: File, val packageName: String? = null) internal class Apk(val file: File, val packageName: String? = null)
internal class DeviceNotFoundException(deviceSerial: String?) :
Exception(deviceSerial?.let {
"The device with the ADB device serial \"$deviceSerial\" can not be found"
} ?: "No ADB device found")
} }