diff --git a/CHANGELOG.md b/CHANGELOG.md index 04a5096..a120a6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +# [1.2.0-dev.2](https://github.com/revanced/revanced-cli/compare/v1.2.0-dev.1...v1.2.0-dev.2) (2022-06-05) + + +### Features + +* debugging option ([1b645c6](https://github.com/revanced/revanced-cli/commit/1b645c67db58eb4d49b5290fd247507c9b43a9c6)) + +# [1.2.0-dev.1](https://github.com/revanced/revanced-cli/compare/v1.1.6-dev.1...v1.2.0-dev.1) (2022-06-04) + + +### Features + +* add path for `cacheDirectory` and enable resource patching by default ([54c0a03](https://github.com/revanced/revanced-cli/commit/54c0a03d44c8d1b586bc487ee1ca71859d6f0b57)) + +## [1.1.6-dev.1](https://github.com/revanced/revanced-cli/compare/v1.1.5...v1.1.6-dev.1) (2022-05-31) + + +### Bug Fixes + +* migrate to latest patcher api changes ([ace70e4](https://github.com/revanced/revanced-cli/commit/ace70e417fdf280c7630a5a89a773879fd240e96)) + ## [1.1.5](https://github.com/revanced/revanced-cli/compare/v1.1.4...v1.1.5) (2022-05-27) diff --git a/build.gradle.kts b/build.gradle.kts index 73bfa86..ebbe3a9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,7 +24,7 @@ repositories { dependencies { implementation("org.jetbrains.kotlin:kotlin-stdlib:1.6.21") - implementation("app.revanced:revanced-patcher:1.0.0-dev.16") + implementation("app.revanced:revanced-patcher:1.0.0-dev.18") implementation("info.picocli:picocli:4.6.3") diff --git a/gradle.properties b/gradle.properties index b78f55e..b78453c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ kotlin.code.style = official -version = 1.1.5 +version = 1.2.0-dev.2 diff --git a/src/main/kotlin/app/revanced/cli/MainCommand.kt b/src/main/kotlin/app/revanced/cli/MainCommand.kt index c997122..b8ab9c4 100644 --- a/src/main/kotlin/app/revanced/cli/MainCommand.kt +++ b/src/main/kotlin/app/revanced/cli/MainCommand.kt @@ -1,7 +1,7 @@ package app.revanced.cli +import app.revanced.patcher.PatcherOptions import app.revanced.patcher.annotation.Name -import app.revanced.patcher.extensions.findAnnotationRecursively import app.revanced.patcher.util.patch.implementation.JarPatchBundle import app.revanced.utils.adb.Adb import app.revanced.utils.patcher.addPatchesFiltered @@ -22,11 +22,11 @@ internal object MainCommand : Runnable { @Option(names = ["-p", "--patches"], description = ["One or more bundles of patches"]) internal var patchBundles = arrayOf() - @Option(names = ["-t", "--temp-dir"], description = ["Temporal resource cache directory"], required = true) - internal lateinit var cacheDirectory: String + @Option(names = ["-t", "--temp-dir"], description = ["Temporal resource cache directory"]) + internal var cacheDirectory = "revanced-cache" - @Option(names = ["-r", "--resource-patcher"], description = ["Enable patching resources"]) - internal var patchResources: Boolean = false + @Option(names = ["-r", "--resource-patcher"], description = ["Disable patching resources"]) + internal var disableResourcePatching: Boolean = false @Option( names = ["-c", "--clean"], @@ -52,23 +52,23 @@ internal object MainCommand : Runnable { @Option(names = ["-d", "--deploy-on"], description = ["If specified, deploy to adb device with given name"]) internal var deploy: String? = null + @Option(names = ["-b", "--debugging"], description = ["Disable patch version compatibility"]) + internal var debugging: Boolean = false + override fun run() { if (listOnly) { - for (patchBundlePath in patchBundles) - for (it in JarPatchBundle(patchBundlePath).loadPatches()) - println( - "[available] ${ - it.findAnnotationRecursively( - Name::class.java - )?.name ?: it::class.java.name - }" - ) + for (patchBundlePath in patchBundles) for (it in JarPatchBundle(patchBundlePath).loadPatches()) { + + // TODO: adjust extension methods to be able to do this + val name = (it.annotations.find { it is Name } as? Name)?.name ?: it.simpleName + println( + "[available] $name" + ) + } return } - val patcher = app.revanced.patcher.Patcher( - inputFile, cacheDirectory, patchResources - ) + val patcher = app.revanced.patcher.Patcher(PatcherOptions(inputFile, cacheDirectory, !disableResourcePatching)) if (signatureCheck) { patcher.addPatchesFiltered() diff --git a/src/main/kotlin/app/revanced/cli/Patcher.kt b/src/main/kotlin/app/revanced/cli/Patcher.kt index 779f1d9..f6d7589 100644 --- a/src/main/kotlin/app/revanced/cli/Patcher.kt +++ b/src/main/kotlin/app/revanced/cli/Patcher.kt @@ -30,8 +30,9 @@ internal class Patcher { zipFileSystem.replaceFile(name, data.data) } - if (MainCommand.patchResources) { - for (file in File(MainCommand.cacheDirectory).resolve("build/").listFiles(FileFilter { it.isDirectory })?.first()?.listFiles()!!) { + if (!MainCommand.disableResourcePatching) { + for (file in File(MainCommand.cacheDirectory).resolve("build/").listFiles(FileFilter { it.isDirectory }) + ?.first()?.listFiles()!!) { if (!file.isDirectory) { zipFileSystem.replaceFile(file.name, file.readBytes()) continue diff --git a/src/main/kotlin/app/revanced/utils/patcher/Patcher.kt b/src/main/kotlin/app/revanced/utils/patcher/Patcher.kt index e8aac78..fee8d8f 100644 --- a/src/main/kotlin/app/revanced/utils/patcher/Patcher.kt +++ b/src/main/kotlin/app/revanced/utils/patcher/Patcher.kt @@ -2,29 +2,23 @@ package app.revanced.utils.patcher import app.revanced.cli.MainCommand import app.revanced.patcher.Patcher -import app.revanced.patcher.annotation.Compatibility -import app.revanced.patcher.annotation.Name import app.revanced.patcher.data.base.Data -import app.revanced.patcher.extensions.findAnnotationRecursively +import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages +import app.revanced.patcher.extensions.PatchExtensions.patchName import app.revanced.patcher.patch.base.Patch import app.revanced.patcher.util.patch.implementation.JarPatchBundle fun Patcher.addPatchesFiltered( - packageCompatibilityFilter: Boolean = true, - packageVersionCompatibilityFilter: Boolean = true, includeFilter: Boolean = false ) { val packageName = this.packageName val packageVersion = this.packageVersion MainCommand.patchBundles.forEach { bundle -> - val includedPatches = mutableListOf>() - JarPatchBundle(bundle).loadPatches().forEach patch@{ p -> - val patch = p.getDeclaredConstructor().newInstance() - - val compatibilityAnnotation = patch.javaClass.findAnnotationRecursively(Compatibility::class.java) - - val patchName = patch.javaClass.findAnnotationRecursively(Name::class.java)?.name ?: patch.javaClass.name + val includedPatches = mutableListOf>>() + JarPatchBundle(bundle).loadPatches().forEach patch@{ patch -> + val compatiblePackages = patch.compatiblePackages + val patchName = patch.patchName val prefix = "[skipped] $patchName" @@ -33,24 +27,16 @@ fun Patcher.addPatchesFiltered( return@patch } - if (packageVersionCompatibilityFilter || packageCompatibilityFilter) { - - if (compatibilityAnnotation == null) { - println("$prefix: Missing compatibility annotation.") + if (compatiblePackages == null) println("$prefix: Missing compatibility annotation. Continuing.") + else compatiblePackages.forEach { compatiblePackage -> + if (compatiblePackage.name != packageName) { + println("$prefix: Package name not matching ${compatiblePackage.name}.") return@patch } - - compatibilityAnnotation.compatiblePackages.forEach { compatiblePackage -> - if (packageCompatibilityFilter && compatiblePackage.name != packageName) { - println("$prefix: Package name not matching ${compatiblePackage.name}.") - return@patch - } - - if (packageVersionCompatibilityFilter && !compatiblePackage.versions.any { it == packageVersion }) { - println("$prefix: Unsupported version.") - return@patch - } + if (!(MainCommand.debugging || compatiblePackage.versions.any { it == packageVersion })) { + println("$prefix: Unsupported version.") + return@patch } } diff --git a/src/main/kotlin/app/revanced/utils/signature/Signature.kt b/src/main/kotlin/app/revanced/utils/signature/Signature.kt index 24afe9d..8057359 100644 --- a/src/main/kotlin/app/revanced/utils/signature/Signature.kt +++ b/src/main/kotlin/app/revanced/utils/signature/Signature.kt @@ -1,55 +1,52 @@ package app.revanced.utils.signature import app.revanced.patcher.Patcher -import app.revanced.patcher.extensions.findAnnotationRecursively -import app.revanced.patcher.signature.implementation.method.annotation.FuzzyPatternScanMethod -import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod import org.jf.dexlib2.iface.Method object Signature { fun checkSignatures(patcher: Patcher) { + TODO() + /** val failed = mutableListOf() for (signature in patcher.resolveSignatures()) { - val signatureClass = signature::class.java - val signatureName = - signatureClass.findAnnotationRecursively(app.revanced.patcher.annotation.Name::class.java)?.name - ?: signatureClass.name - if (!signature.resolved) { - failed.add(signatureName) - continue - } + val signatureClass = signature::class.java + val signatureName = signature.name ?: signatureClass.simpleName + if (!signature.resolved) { + failed.add(signatureName) + continue + } - val method = signature.result!!.method - val matchingMethod = - signatureClass.findAnnotationRecursively(MatchingMethod::class.java) ?: MatchingMethod() + val method = signature.result!!.method + val matchingMethod = signature.matchingMethod ?: MatchingMethod() - println( - """ - [Signature] $signatureName - [Method] ${matchingMethod.definingClass}->${matchingMethod.name} - [Match] ${method.definingClass}->${method.toStr()} - """.trimIndent() - ) + println( + """ + [Signature] $signatureName + [Method] ${matchingMethod.definingClass}->${matchingMethod.name} + [Match] ${method.definingClass}->${method.toStr()} + """.trimIndent() + ) - signatureClass.findAnnotationRecursively(FuzzyPatternScanMethod::class.java)?.let { - val warnings = signature.result!!.scanResult.warnings!! - println( - """ - [Warnings: ${warnings.count()}] - ${warnings.joinToString(separator = "\n") { warning -> "${warning.instructionIndex} / ${warning.patternIndex}: ${warning.wrongOpcode} (expected: ${warning.correctOpcode})" }} - """.trimIndent() - ) - } + signature.fuzzyThreshold.let { + val warnings = signature.result!!.scanResult.warnings!! + println( + """ + [Warnings: ${warnings.count()}] + ${warnings.joinToString(separator = "\n") { warning -> "${warning.instructionIndex} / ${warning.patternIndex}: ${warning.wrongOpcode} (expected: ${warning.correctOpcode})" }} + """.trimIndent() + ) + } } println( - """ - ${"=".repeat(50)} - [Failed signatures: ${failed.size}] - ${failed.joinToString(separator = "\n") { it }} + """ + ${"=".repeat(50)} + [Failed signatures: ${failed.size}] + ${failed.joinToString(separator = "\n") { it }} """.trimIndent() ) + */ } private fun Method.toStr(): String {