Compare commits

..

23 Commits

Author SHA1 Message Date
oSumAtrIX
b6b6f159cc refactor 2026-01-28 20:10:14 +01:00
oSumAtrIX
b140badcf1 update to newest patcher v22 2026-01-28 16:27:41 +01:00
oSumAtrIX
e6032a1e4f update to patcher v22 for dev 2026-01-28 15:26:40 +01:00
oSumAtrIX
0725395b23 build: Bump Gradle 2026-01-28 15:26:27 +01:00
Pun Butrach
731865e167 docs: Use American spelling (#381) 2025-12-14 16:39:29 +01:00
Pun Butrach
8e18082862 ci: Use default fetch-depth of 1 for checkout step (#375) 2025-07-08 18:01:12 +02:00
Pun Butrach
77862e8940 ci: Attest release artifacts (#367)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2025-05-22 14:54:29 +02:00
semantic-release-bot
f29eda8674 chore: Release v5.0.2-dev.2 [skip ci]
## [5.0.2-dev.2](https://github.com/ReVanced/revanced-cli/compare/v5.0.2-dev.1...v5.0.2-dev.2) (2025-04-25)

### Bug Fixes

* Do not print patch description if null ([bba90fe](bba90fede8))
2025-04-25 20:29:10 +00:00
oSumAtrIX
bba90fede8 fix: Do not print patch description if null 2025-04-25 22:27:11 +02:00
semantic-release-bot
1717cc66f7 chore: Release v5.0.2-dev.1 [skip ci]
## [5.0.2-dev.1](https://github.com/ReVanced/revanced-cli/compare/v5.0.1...v5.0.2-dev.1) (2025-04-20)

### Bug Fixes

* Group `mount` and `install` options into an argument group  ([#364](https://github.com/ReVanced/revanced-cli/issues/364)) ([0c53a2d](0c53a2d1d7))
2025-04-20 23:20:36 +00:00
laur89
0c53a2d1d7 fix: Group mount and install options into an argument group (#364)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2025-04-21 01:18:41 +02:00
semantic-release-bot
a0189aeaee chore: Release v5.0.1 [skip ci]
## [5.0.1](https://github.com/ReVanced/revanced-cli/compare/v5.0.0...v5.0.1) (2025-04-14)

### Bug Fixes

* Make mounting work again by bumping dependencies ([#359](https://github.com/ReVanced/revanced-cli/issues/359)) ([68a4872](68a48724eb))
2025-04-14 08:53:31 +00:00
oSumAtrIX
19e8422588 chore: Merge branch dev to main (#354)
Co-authored-by: kitadai31 <90122968+kitadai31@users.noreply.github.com>
Co-authored-by: Jamie McCullough <92225779+AoifeMcCull@users.noreply.github.com>
Co-authored-by: semantic-release-bot <semantic-release-bot@martynus.net>
2025-04-14 10:51:31 +02:00
semantic-release-bot
d908595b22 chore: Release v5.0.1-dev.1 [skip ci]
## [5.0.1-dev.1](https://github.com/ReVanced/revanced-cli/compare/v5.0.0...v5.0.1-dev.1) (2025-02-26)

### Bug Fixes

* Make mounting work again by bumping dependencies ([#359](https://github.com/ReVanced/revanced-cli/issues/359)) ([68a4872](68a48724eb))
2025-02-26 21:52:52 +00:00
Jamie McCullough
68a48724eb fix: Make mounting work again by bumping dependencies (#359) 2025-02-26 22:50:58 +01:00
kitadai31
bf31de4148 build: Remove AAPT1 binary & minimize ReVanced Library (#340) 2024-12-24 01:52:44 +01:00
semantic-release-bot
63b6350afc chore: Release v5.0.0 [skip ci]
# [5.0.0](https://github.com/ReVanced/revanced-cli/compare/v4.6.0...v5.0.0) (2024-11-10)

### Bug Fixes

* Check for null when no device serial was specified ([1da8ae9](1da8ae9e46))
* List if patch option is required ([#346](https://github.com/ReVanced/revanced-cli/issues/346)) ([98ff0c3](98ff0c34fa))
* Make CLI ArgGroup non-exclusive to be able to disable and enable patches at the same time ([1bb0d13](1bb0d13726))
* Make patches selectable by using a mutable collection for the selection option ([751fa1d](751fa1d889))
* Make the patch command work without specifying any selection ([ba159a3](ba159a35a9))
* Print in new line correctly ([c2dc9d7](c2dc9d76be))
* Use the first connected device when no ADB device is specified ([5f952f3](5f952f35f5))

### Features

* Set patch options via CLI ([#336](https://github.com/ReVanced/revanced-cli/issues/336)) ([2300243](23002434b2))
* Show error about no installation device found at the beginning ([3300e6b](3300e6b433))
* Simplify command and option names and descriptions ([#338](https://github.com/ReVanced/revanced-cli/issues/338)) ([6e7797a](6e7797a3f0))
* Simplify option descriptions ([45c998b](45c998b335))

### BREAKING CHANGES

* Options have been renamed.
* This commit changes various CLI options and removes the `options.json` file. Instead, patch options can now be passed via CLI options
2024-11-10 14:57:43 +00:00
oSumAtrIX
5d8beae7be chore: Merge branch dev to main (#328) 2024-11-10 15:55:48 +01:00
semantic-release-bot
dbbc00706d chore: Release v5.0.0-dev.11 [skip ci]
# [5.0.0-dev.11](https://github.com/ReVanced/revanced-cli/compare/v5.0.0-dev.10...v5.0.0-dev.11) (2024-11-10)

### Bug Fixes

* List if patch option is required ([#346](https://github.com/ReVanced/revanced-cli/issues/346)) ([98ff0c3](98ff0c34fa))
2024-11-10 14:49:46 +00:00
decipher
98ff0c34fa fix: List if patch option is required (#346) 2024-11-10 15:47:55 +01:00
semantic-release-bot
77be717de0 chore: Release v5.0.0-dev.10 [skip ci]
# [5.0.0-dev.10](https://github.com/ReVanced/revanced-cli/compare/v5.0.0-dev.9...v5.0.0-dev.10) (2024-11-05)

### Bug Fixes

* Make CLI ArgGroup non-exclusive to be able to disable and enable patches at the same time ([1bb0d13](1bb0d13726))
2024-11-05 19:01:23 +00:00
oSumAtrIX
1bb0d13726 fix: Make CLI ArgGroup non-exclusive to be able to disable and enable patches at the same time 2024-11-05 19:59:09 +01:00
oSumAtrIX
18e56e6ff4 build(Needs bump): Bump dependencies 2024-11-05 19:58:21 +01:00
14 changed files with 224 additions and 141 deletions

View File

@@ -13,8 +13,6 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cache Gradle
uses: burrunan/gradle-cache-action@v1

View File

@@ -12,15 +12,12 @@ jobs:
name: Release
permissions:
contents: write
id-token: write
attestations: write
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
# Make sure the release step uses its own credentials:
# https://github.com/cycjimmy/semantic-release-action#private-packages
persist-credentials: false
fetch-depth: 0
- name: Cache Gradle
uses: burrunan/gradle-cache-action@v1
@@ -47,6 +44,14 @@ jobs:
fingerprint: ${{ vars.GPG_FINGERPRINT }}
- name: Release
uses: cycjimmy/semantic-release-action@v4
id: release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: npm exec semantic-release
- name: Attest
if: steps.release.outputs.new_release_published == 'true'
uses: actions/attest-build-provenance@v2
with:
subject-name: 'ReVanced CLI ${{ steps.release.outputs.new_release_git_tag }}'
subject-path: build/libs/revanced-cli*.jar

View File

@@ -1,3 +1,72 @@
## [5.0.2-dev.2](https://github.com/ReVanced/revanced-cli/compare/v5.0.2-dev.1...v5.0.2-dev.2) (2025-04-25)
### Bug Fixes
* Do not print patch description if null ([bba90fe](https://github.com/ReVanced/revanced-cli/commit/bba90fede85e4632efb9509e5bcf9091a9435549))
## [5.0.2-dev.1](https://github.com/ReVanced/revanced-cli/compare/v5.0.1...v5.0.2-dev.1) (2025-04-20)
### Bug Fixes
* Group `mount` and `install` options into an argument group ([#364](https://github.com/ReVanced/revanced-cli/issues/364)) ([0c53a2d](https://github.com/ReVanced/revanced-cli/commit/0c53a2d1d75d3d934d134594751fe6cd0b000d1a))
## [5.0.1](https://github.com/ReVanced/revanced-cli/compare/v5.0.0...v5.0.1) (2025-04-14)
### Bug Fixes
* Make mounting work again by bumping dependencies ([#359](https://github.com/ReVanced/revanced-cli/issues/359)) ([68a4872](https://github.com/ReVanced/revanced-cli/commit/68a48724ebf01a0c8f8adc0fec63037bff672dc9))
## [5.0.1-dev.1](https://github.com/ReVanced/revanced-cli/compare/v5.0.0...v5.0.1-dev.1) (2025-02-26)
### Bug Fixes
* Make mounting work again by bumping dependencies ([#359](https://github.com/ReVanced/revanced-cli/issues/359)) ([68a4872](https://github.com/ReVanced/revanced-cli/commit/68a48724ebf01a0c8f8adc0fec63037bff672dc9))
# [5.0.0](https://github.com/ReVanced/revanced-cli/compare/v4.6.0...v5.0.0) (2024-11-10)
### Bug Fixes
* Check for null when no device serial was specified ([1da8ae9](https://github.com/ReVanced/revanced-cli/commit/1da8ae9e46000dd3c4eecd793c559e75012cf535))
* List if patch option is required ([#346](https://github.com/ReVanced/revanced-cli/issues/346)) ([98ff0c3](https://github.com/ReVanced/revanced-cli/commit/98ff0c34fa71c3b3ecd96157d45a30ee2b8979c6))
* Make CLI ArgGroup non-exclusive to be able to disable and enable patches at the same time ([1bb0d13](https://github.com/ReVanced/revanced-cli/commit/1bb0d13726fd5790c59cb6d28df3618c7606710d))
* Make patches selectable by using a mutable collection for the selection option ([751fa1d](https://github.com/ReVanced/revanced-cli/commit/751fa1d889f40c51b291116029fd84f2b051f2f0))
* Make the patch command work without specifying any selection ([ba159a3](https://github.com/ReVanced/revanced-cli/commit/ba159a35a9a99d18a4c1e04128b08ae336a49b3e))
* Print in new line correctly ([c2dc9d7](https://github.com/ReVanced/revanced-cli/commit/c2dc9d76be33c98284741e23c406500483c47753))
* Use the first connected device when no ADB device is specified ([5f952f3](https://github.com/ReVanced/revanced-cli/commit/5f952f35f5cb388b6509b2b4d905b8143ebc7996))
### Features
* Set patch options via CLI ([#336](https://github.com/ReVanced/revanced-cli/issues/336)) ([2300243](https://github.com/ReVanced/revanced-cli/commit/23002434b2d51c2a3b30b33dd0526261432d90ce))
* Show error about no installation device found at the beginning ([3300e6b](https://github.com/ReVanced/revanced-cli/commit/3300e6b4333ed1c4e6785cb82eca9016fc6d4a20))
* Simplify command and option names and descriptions ([#338](https://github.com/ReVanced/revanced-cli/issues/338)) ([6e7797a](https://github.com/ReVanced/revanced-cli/commit/6e7797a3f0525a8f48af7182157da0d045600ac2))
* Simplify option descriptions ([45c998b](https://github.com/ReVanced/revanced-cli/commit/45c998b335b65ac233fece8b804dc7410142691c))
### BREAKING CHANGES
* Options have been renamed.
* This commit changes various CLI options and removes the `options.json` file. Instead, patch options can now be passed via CLI options
# [5.0.0-dev.11](https://github.com/ReVanced/revanced-cli/compare/v5.0.0-dev.10...v5.0.0-dev.11) (2024-11-10)
### Bug Fixes
* List if patch option is required ([#346](https://github.com/ReVanced/revanced-cli/issues/346)) ([98ff0c3](https://github.com/ReVanced/revanced-cli/commit/98ff0c34fa71c3b3ecd96157d45a30ee2b8979c6))
# [5.0.0-dev.10](https://github.com/ReVanced/revanced-cli/compare/v5.0.0-dev.9...v5.0.0-dev.10) (2024-11-05)
### Bug Fixes
* Make CLI ArgGroup non-exclusive to be able to disable and enable patches at the same time ([1bb0d13](https://github.com/ReVanced/revanced-cli/commit/1bb0d13726fd5790c59cb6d28df3618c7606710d))
# [5.0.0-dev.9](https://github.com/ReVanced/revanced-cli/compare/v5.0.0-dev.8...v5.0.0-dev.9) (2024-11-05)

View File

@@ -100,7 +100,7 @@ To build a ReVanced CLI, you can follow the [documentation](/docs).
You can find the documentation of ReVanced CLI [here](/docs).
## 📜 Licence
## 📜 License
ReVanced CLI is licensed under the GPLv3 license. Please see the [license file](LICENSE) for more information.
[tl;dr](https://www.tldrlegal.com/license/gnu-general-public-license-v3-gpl-3) you may copy, distribute and modify ReVanced CLI as long as you track changes/dates in source files.

View File

@@ -15,6 +15,7 @@ application {
}
repositories {
mavenLocal()
mavenCentral()
google()
maven {
@@ -28,6 +29,8 @@ repositories {
}
dependencies {
implementation(libs.bcpg.jdk18on)
implementation(libs.sigstore.java)
implementation(libs.revanced.patcher)
implementation(libs.revanced.library)
implementation(libs.kotlinx.coroutines.core)
@@ -39,6 +42,11 @@ dependencies {
kotlin {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_11)
freeCompilerArgs.addAll(
"-Xexplicit-backing-fields",
"-Xcontext-parameters",
)
}
}
@@ -59,10 +67,10 @@ tasks {
}
shadowJar {
exclude("/prebuilt/linux/aapt", "/prebuilt/windows/aapt.exe", "/prebuilt/*/aapt_*")
minimize {
exclude(dependency("org.jetbrains.kotlin:.*"))
exclude(dependency("org.bouncycastle:.*"))
exclude(dependency("app.revanced:.*"))
exclude(dependency("app.revanced:revanced-patcher"))
}
}

View File

@@ -1,4 +1,4 @@
org.gradle.parallel = true
org.gradle.caching = true
kotlin.code.style = official
version = 5.0.0-dev.9
version = 5.0.2-dev.2

View File

@@ -1,18 +1,22 @@
[versions]
shadow = "8.1.1"
kotlin = "2.0.20"
kotlinx = "1.8.1"
picocli = "4.7.6"
revanced-patcher = "20.0.2"
revanced-library = "3.0.0"
bcpg-jdk18on = "1.82"
shadow = "9.3.1"
kotlin = "2.3.0"
kotlinx = "1.10.2"
picocli = "4.7.7"
revanced-patcher = "22.0.0-local"
revanced-library = "3.2.0-dev.2-local"
sigstore = "2.0.0"
[libraries]
bcpg-jdk18on = { module = "org.bouncycastle:bcpg-jdk18on", version.ref = "bcpg-jdk18on" }
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx" }
picocli = { module = "info.picocli:picocli", version.ref = "picocli" }
revanced-patcher = { module = "app.revanced:revanced-patcher", version.ref = "revanced-patcher" }
revanced-patcher = { module = "app.revanced:patcher", version.ref = "revanced-patcher" }
revanced-library = { module = "app.revanced:revanced-library-jvm", version.ref = "revanced-library" }
sigstore-java = { module = "dev.sigstore:sigstore-java", version.ref = "sigstore" }
[plugins]
shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" }
shadow = { id = "com.gradleup.shadow", version.ref = "shadow" }
kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }

Binary file not shown.

View File

@@ -1,7 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

7
gradlew vendored
View File

@@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
@@ -55,7 +57,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -84,7 +86,8 @@ done
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum

2
gradlew.bat vendored
View File

@@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################

View File

@@ -3,7 +3,7 @@ package app.revanced.cli.command
import app.revanced.library.PackageName
import app.revanced.library.VersionMap
import app.revanced.library.mostCommonCompatibleVersions
import app.revanced.patcher.patch.loadPatchesFromJar
import app.revanced.patcher.patch.loadPatches
import picocli.CommandLine
import java.io.File
import java.util.logging.Logger
@@ -48,15 +48,14 @@ internal class ListCompatibleVersions : Runnable {
}
}
fun buildString(entry: Map.Entry<PackageName, VersionMap>) =
buildString {
fun buildString(entry: Map.Entry<PackageName, VersionMap>) = buildString {
val (name, versions) = entry
appendLine("Package name: $name")
appendLine("Most common compatible versions:")
appendLine(versions.buildVersionsString().prependIndent("\t"))
}
val patches = loadPatchesFromJar(patchesFiles)
val patches = loadPatches(patchesFiles = patchesFiles.toTypedArray())
patches.mostCommonCompatibleVersions(
packageNames,

View File

@@ -2,7 +2,7 @@ package app.revanced.cli.command
import app.revanced.patcher.patch.Package
import app.revanced.patcher.patch.Patch
import app.revanced.patcher.patch.loadPatchesFromJar
import app.revanced.patcher.patch.loadPatches
import picocli.CommandLine.*
import picocli.CommandLine.Help.Visibility.ALWAYS
import java.io.File
@@ -85,14 +85,11 @@ internal object ListPatchesCommand : Runnable {
}
}
fun PatchOption<*>.buildString() =
buildString {
appendLine("Title: $title")
fun PatchOption<*>.buildString() = buildString {
appendLine("Name: $name")
description?.let { appendLine("Description: $it") }
default?.let {
appendLine("Key: $key")
append("Default: $it")
} ?: append("Key: $key")
appendLine("Required: $required")
default?.let { append("Default: $it") }
values?.let { values ->
appendLine("\nPossible values:")
@@ -102,14 +99,13 @@ internal object ListPatchesCommand : Runnable {
append("\nType: $type")
}
fun IndexedValue<Patch<*>>.buildString() =
let { (index, patch) ->
fun IndexedValue<Patch>.buildString() = let { (index, patch) ->
buildString {
if (withIndex) appendLine("Index: $index")
append("Name: ${patch.name}")
if (withDescriptions) append("\nDescription: ${patch.description}")
if (withDescriptions) patch.description?.let { append("\nDescription: $it") }
append("\nEnabled: ${patch.use}")
@@ -133,11 +129,10 @@ internal object ListPatchesCommand : Runnable {
}
}
fun Patch<*>.filterCompatiblePackages(name: String) =
compatiblePackages?.any { (compatiblePackageName, _) -> compatiblePackageName == name }
fun Patch.filterCompatiblePackages(name: String) = compatiblePackages?.any { (compatiblePackageName, _) -> compatiblePackageName == name }
?: withUniversalPatches
val patches = loadPatchesFromJar(patchesFiles).withIndex().toList()
val patches = loadPatches(patchesFiles = patchesFiles.toTypedArray()).withIndex().toList()
val filtered =
packageName?.let { patches.filter { (_, patch) -> patch.filterCompatiblePackages(it) } } ?: patches

View File

@@ -4,10 +4,9 @@ import app.revanced.library.ApkUtils
import app.revanced.library.ApkUtils.applyTo
import app.revanced.library.installation.installer.*
import app.revanced.library.setOptions
import app.revanced.patcher.Patcher
import app.revanced.patcher.PatcherConfig
import app.revanced.patcher.patch.Patch
import app.revanced.patcher.patch.loadPatchesFromJar
import app.revanced.patcher.patch.loadPatches
import app.revanced.patcher.patcher
import kotlinx.coroutines.runBlocking
import picocli.CommandLine
import picocli.CommandLine.ArgGroup
@@ -29,11 +28,11 @@ internal object PatchCommand : Runnable {
@Spec
private lateinit var spec: CommandSpec
@ArgGroup(multiplicity = "0..*")
@ArgGroup(exclusive = false, multiplicity = "0..*")
private var selection = mutableSetOf<Selection>()
internal class Selection {
@ArgGroup(exclusive = false, multiplicity = "1")
@ArgGroup(exclusive = false)
internal var enabled: EnableSelection? = null
internal class EnableSelection {
@@ -65,7 +64,7 @@ internal object PatchCommand : Runnable {
internal var options = mutableMapOf<String, Any?>()
}
@ArgGroup(exclusive = false, multiplicity = "1")
@ArgGroup(exclusive = false)
internal var disable: DisableSelection? = null
internal class DisableSelection {
@@ -115,21 +114,27 @@ internal object PatchCommand : Runnable {
this.outputFilePath = outputFilePath?.absoluteFile
}
@ArgGroup(exclusive = false, multiplicity = "0..1")
internal var installation: Installation? = null
internal class Installation {
@CommandLine.Option(
names = ["-i", "--install"],
required = true,
description = ["Serial of the ADB device to install to. If not specified, the first connected device will be used."],
// Empty string to indicate that the first connected device should be used.
fallbackValue = "",
fallbackValue = "", // Empty string is used to select the first of connected devices.
arity = "0..1",
)
private var deviceSerial: String? = null
internal var deviceSerial: String? = null
@CommandLine.Option(
names = ["--mount"],
required = false,
description = ["Install the patched APK file by mounting."],
showDefaultValue = ALWAYS,
)
private var mount: Boolean = false
internal var mount: Boolean = false
}
@CommandLine.Option(
names = ["--keystore"],
@@ -245,16 +250,16 @@ internal object PatchCommand : Runnable {
keyStoreFilePath ?: outputFilePath.parentFile
.resolve("${outputFilePath.nameWithoutExtension}.keystore")
val installer = if (deviceSerial != null) {
val deviceSerial = deviceSerial!!.ifEmpty { null }
val installer = if (installation?.deviceSerial != null) {
val deviceSerial = installation?.deviceSerial!!.ifEmpty { null }
try {
if (mount) {
if (installation?.mount == true) {
AdbRootInstaller(deviceSerial)
} else {
AdbInstaller(deviceSerial)
}
} catch (e: DeviceNotFoundException) {
} catch (_: DeviceNotFoundException) {
if (deviceSerial?.isNotEmpty() == true) {
logger.severe(
"Device with serial $deviceSerial not found to install to. " +
@@ -279,43 +284,43 @@ internal object PatchCommand : Runnable {
logger.info("Loading patches")
val patches = loadPatchesFromJar(patchesFiles)
val patches = loadPatches(patchesFiles = patchesFiles.toTypedArray()) { file, throwable ->
logger.severe("Failed to load patches from ${file.path}:\n$throwable")
}
// endregion
val patcherTemporaryFilesPath = temporaryFilesPath.resolve("patcher")
val (packageName, patcherResult) = Patcher(
PatcherConfig(
lateinit var _packageName: String
val patch = patcher(
apk,
patcherTemporaryFilesPath,
aaptBinaryPath?.path,
aaptBinaryPath,
patcherTemporaryFilesPath.absolutePath,
true,
),
).use { patcher ->
val packageName = patcher.context.packageMetadata.packageName
val packageVersion = patcher.context.packageMetadata.packageVersion
) { packageName, versionName ->
_packageName = packageName
val filteredPatches = patches.filterPatchSelection(packageName, packageVersion)
val filteredPatches = patches.filterPatchSelection(packageName, versionName)
logger.info("Setting patch options")
val patchesList = patches.toList()
selection.filter { it.enabled != null }.associate {
val enabledSelection = it.enabled!!
val name = enabledSelection.selector.name ?: patchesList[enabledSelection.selector.index!!].name!!
(enabledSelection.selector.name ?: patchesList[enabledSelection.selector.index!!].name!!) to
enabledSelection.options
name to enabledSelection.options
}.let(filteredPatches::setOptions)
patcher += filteredPatches
filteredPatches
}
// Execute patches.
runBlocking {
patcher().collect { patchResult ->
val patchesResult = patch { patchResult ->
val exception = patchResult.exception
?: return@collect logger.info("\"${patchResult.patch}\" succeeded")
?: return@patch logger.info("\"${patchResult.patch}\" succeeded")
StringWriter().use { writer ->
exception.printStackTrace(PrintWriter(writer))
@@ -323,19 +328,15 @@ internal object PatchCommand : Runnable {
logger.severe("\"${patchResult.patch}\" failed:\n$writer")
}
}
}
patcher.context.packageMetadata.packageName to patcher.get()
}
// region Save.
apk.copyTo(temporaryFilesPath.resolve(apk.name), overwrite = true).apply {
patcherResult.applyTo(this)
}.let { patchedApkFile ->
if (!mount) {
apk.copyTo(temporaryFilesPath.resolve(apk.name), overwrite = true).let {
patchesResult.applyTo(it)
if (installation?.mount != true) {
ApkUtils.signApk(
patchedApkFile,
it,
outputFilePath,
signer,
ApkUtils.KeyStoreDetails(
@@ -346,7 +347,7 @@ internal object PatchCommand : Runnable {
),
)
} else {
patchedApkFile.copyTo(outputFilePath, overwrite = true)
it.copyTo(outputFilePath, overwrite = true)
}
}
@@ -356,9 +357,9 @@ internal object PatchCommand : Runnable {
// region Install.
deviceSerial?.let {
installation?.deviceSerial?.let {
runBlocking {
when (val result = installer!!.install(Installer.Apk(outputFilePath, packageName))) {
when (val result = installer!!.install(Installer.Apk(outputFilePath, _packageName))) {
RootInstallerResult.FAILURE -> logger.severe("Failed to mount the patched APK file")
is AdbInstallerResult.Failure -> logger.severe(result.exception.toString())
else -> logger.info("Installed the patched APK file")
@@ -381,10 +382,10 @@ internal object PatchCommand : Runnable {
* @param packageVersion The version of the APK file to be patched.
* @return The filtered patches.
*/
private fun Set<Patch<*>>.filterPatchSelection(
private fun Set<Patch>.filterPatchSelection(
packageName: String,
packageVersion: String,
): Set<Patch<*>> = buildSet {
) = buildSet {
val enabledPatchesByName =
selection.mapNotNull { it.enabled?.selector?.name }.toSet()
val enabledPatchesByIndex =