@@ -33,6 +33,20 @@ internal object MainCommand : Runnable {
33
33
lateinit var args: Args
34
34
35
35
class Args {
36
+ @Option(names = [" -a" , " --apk" ], description = [" Input file to be patched" ], required = true )
37
+ lateinit var inputFile: File
38
+
39
+ @Option(names = [" --uninstall" ], description = [" Uninstall the mount variant" ])
40
+ var uninstall: Boolean = false
41
+
42
+ @Option(names = [" -d" , " --deploy-on" ], description = [" If specified, deploy to adb device with given name" ])
43
+ var deploy: String? = null
44
+
45
+ @ArgGroup(exclusive = false )
46
+ var sArgs: StartPatcherArgs ? = null
47
+ }
48
+
49
+ class StartPatcherArgs {
36
50
@Option(names = [" -b" , " --bundles" ], description = [" One or more bundles of patches" ], required = true )
37
51
var patchBundles = arrayOf<String >()
38
52
@@ -58,9 +72,6 @@ internal object MainCommand : Runnable {
58
72
}
59
73
60
74
class PatchingArgs {
61
- @Option(names = [" -a" , " --apk" ], description = [" Input file to be patched" ], required = true )
62
- lateinit var inputFile: File
63
-
64
75
@Option(names = [" -o" , " --out" ], description = [" Output file path" ], required = true )
65
76
lateinit var outputPath: String
66
77
@@ -94,9 +105,6 @@ internal object MainCommand : Runnable {
94
105
@Option(names = [" -p" , " --password" ], description = [" Overwrite the default password for the signed file" ])
95
106
var password = " ReVanced"
96
107
97
- @Option(names = [" -d" , " --deploy-on" ], description = [" If specified, deploy to adb device with given name" ])
98
- var deploy: String? = null
99
-
100
108
@Option(names = [" -t" , " --temp-dir" ], description = [" Temporal resource cache directory" ])
101
109
var cacheDirectory = " revanced-cache"
102
110
@@ -108,16 +116,37 @@ internal object MainCommand : Runnable {
108
116
}
109
117
110
118
override fun run () {
111
- if (args.lArgs?.listOnly == true ) {
119
+ if (args.sArgs?. lArgs?.listOnly == true ) {
112
120
printListOfPatches()
113
121
return
114
122
}
115
123
116
- val args = args.pArgs ? : return
124
+ if (args.uninstall) {
125
+ // temporarily get package name using Patcher method
126
+ // fix: abstract options in patcher
127
+ val patcher = app.revanced.patcher.Patcher (
128
+ PatcherOptions (
129
+ args.inputFile,
130
+ " uninstaller-cache" ,
131
+ false
132
+ )
133
+ )
134
+ File (" uninstaller-cache" ).deleteRecursively()
135
+
136
+ val adb: Adb ? = args.deploy?.let {
137
+ Adb (File (" placeholder_file" ), patcher.data.packageMetadata.packageName, args.deploy!! , false )
138
+ }
139
+ adb?.uninstall()
140
+
141
+ return
142
+ }
143
+
144
+ val _args = args
145
+ val args = args.sArgs?.pArgs ? : return
117
146
118
147
val patcher = app.revanced.patcher.Patcher (
119
148
PatcherOptions (
120
- args .inputFile,
149
+ _args .inputFile,
121
150
args.cacheDirectory,
122
151
! args.disableResourcePatching,
123
152
logger = PatcherLogger
@@ -126,10 +155,9 @@ internal object MainCommand : Runnable {
126
155
127
156
val outputFile = File (args.outputPath)
128
157
129
- val adb: Adb ? = args .deploy?.let {
130
- Adb (outputFile, patcher.data.packageMetadata.packageName, args .deploy!! , ! args.mount)
158
+ val adb: Adb ? = _args .deploy?.let {
159
+ Adb (outputFile, patcher.data.packageMetadata.packageName, _args .deploy!! , ! args.mount)
131
160
}
132
-
133
161
val patchedFile = if (args.mount) outputFile
134
162
else File (args.cacheDirectory).resolve(" ${outputFile.nameWithoutExtension} _raw.apk" )
135
163
@@ -153,17 +181,17 @@ internal object MainCommand : Runnable {
153
181
154
182
adb?.deploy()
155
183
156
- if (args.clean && args .deploy != null ) Files .delete(outputFile.toPath())
184
+ if (args.clean && _args .deploy != null ) Files .delete(outputFile.toPath())
157
185
158
186
logger.info(" Finished" )
159
187
}
160
188
161
189
private fun printListOfPatches () {
162
- for (patchBundlePath in args.patchBundles) for (patch in JarPatchBundle (patchBundlePath).loadPatches()) {
190
+ for (patchBundlePath in args.sArgs?. patchBundles!! ) for (patch in JarPatchBundle (patchBundlePath).loadPatches()) {
163
191
for (compatiblePackage in patch.compatiblePackages!! ) {
164
192
val packageEntryStr = buildString {
165
193
// Add package if flag is set
166
- if (args.lArgs?.withPackages == true ) {
194
+ if (args.sArgs?. lArgs?.withPackages == true ) {
167
195
val packageName = compatiblePackage.name.substringAfterLast(" ." ).padStart(10 )
168
196
append(packageName)
169
197
append(" \t " )
@@ -172,12 +200,12 @@ internal object MainCommand : Runnable {
172
200
val patchName = patch.patchName.padStart(25 )
173
201
append(patchName)
174
202
// Add description if flag is set.
175
- if (args.lArgs?.withDescriptions == true ) {
203
+ if (args.sArgs?. lArgs?.withDescriptions == true ) {
176
204
append(" \t " )
177
205
append(patch.description)
178
206
}
179
207
// Add compatible versions, if flag is set
180
- if (args.lArgs?.withVersions == true ) {
208
+ if (args.sArgs?. lArgs?.withVersions == true ) {
181
209
val compatibleVersions = compatiblePackage.versions.joinToString(separator = " , " )
182
210
append(" \t " )
183
211
append(compatibleVersions)
0 commit comments