mirror of
https://github.com/revanced/revanced-cli.git
synced 2025-05-03 16:14:33 +02:00
commit
46c275feb5
4
.github/workflows/release.yml
vendored
4
.github/workflows/release.yml
vendored
@ -3,9 +3,11 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
- dev
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
- dev
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
name: Release
|
name: Release
|
||||||
@ -18,7 +20,7 @@ jobs:
|
|||||||
- name: Setup JDK
|
- name: Setup JDK
|
||||||
uses: actions/setup-java@v2
|
uses: actions/setup-java@v2
|
||||||
with:
|
with:
|
||||||
java-version: '8'
|
java-version: '17'
|
||||||
distribution: 'adopt'
|
distribution: 'adopt'
|
||||||
cache: gradle
|
cache: gradle
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
|
13
CHANGELOG.md
13
CHANGELOG.md
@ -1,3 +1,16 @@
|
|||||||
|
# [1.1.0-dev.1](https://github.com/revanced/revanced-cli/compare/v1.0.1...v1.1.0-dev.1) (2022-05-07)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* ClassLoader not working with Java 9+ ([3a11e11](https://github.com/revanced/revanced-cli/commit/3a11e1135bd1e8958dd21247622d549440725ead))
|
||||||
|
* leftover TODOs ([5b1139c](https://github.com/revanced/revanced-cli/commit/5b1139ce43df1f5c2c848a8209a9e618857031ce))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* run `release.yml` workflow on branch `dev` ([9a64730](https://github.com/revanced/revanced-cli/commit/9a6473056b940c6df4860dd09c09d7ac61545f7d))
|
||||||
|
|
||||||
## [1.0.1](https://github.com/revanced/revanced-cli/compare/v1.0.0...v1.0.1) (2022-05-07)
|
## [1.0.1](https://github.com/revanced/revanced-cli/compare/v1.0.0...v1.0.1) (2022-05-07)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 1.0.1
|
version = 1.1.0-dev.1
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package app.revanced.cli
|
package app.revanced.cli
|
||||||
|
|
||||||
import app.revanced.patch.PatchLoader
|
|
||||||
import app.revanced.patch.Patches
|
import app.revanced.patch.Patches
|
||||||
import app.revanced.utils.adb.Adb
|
import app.revanced.utils.adb.Adb
|
||||||
import picocli.CommandLine.*
|
import picocli.CommandLine.*
|
||||||
@ -49,8 +48,7 @@ internal object MainCommand : Runnable {
|
|||||||
override fun run() {
|
override fun run() {
|
||||||
if (listOnly) {
|
if (listOnly) {
|
||||||
patchBundles.forEach {
|
patchBundles.forEach {
|
||||||
PatchLoader.injectPatches(it)
|
Patches.load(it).forEach {
|
||||||
Patches.loadPatches().forEach {
|
|
||||||
println(it().metadata)
|
println(it().metadata)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package app.revanced.cli
|
package app.revanced.cli
|
||||||
|
|
||||||
import app.revanced.patch.PatchLoader
|
|
||||||
import app.revanced.patch.Patches
|
import app.revanced.patch.Patches
|
||||||
import app.revanced.patcher.data.base.Data
|
import app.revanced.patcher.data.base.Data
|
||||||
import app.revanced.patcher.patch.base.Patch
|
import app.revanced.patcher.patch.base.Patch
|
||||||
@ -52,19 +51,16 @@ internal class Patcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun app.revanced.patcher.Patcher.addPatchesFiltered() {
|
private fun app.revanced.patcher.Patcher.addPatchesFiltered() {
|
||||||
// TODO: get package metadata (outside of this method) for apk file which needs to be patched
|
|
||||||
val packageName = this.packageName
|
val packageName = this.packageName
|
||||||
val packageVersion = this.packageVersion
|
val packageVersion = this.packageVersion
|
||||||
|
|
||||||
val checkInclude = MainCommand.includedPatches.isNotEmpty()
|
val checkInclude = MainCommand.includedPatches.isNotEmpty()
|
||||||
|
|
||||||
MainCommand.patchBundles.forEach { bundle ->
|
MainCommand.patchBundles.forEach { bundle ->
|
||||||
PatchLoader.injectPatches(bundle)
|
|
||||||
val includedPatches = mutableListOf<Patch<Data>>()
|
val includedPatches = mutableListOf<Patch<Data>>()
|
||||||
Patches.loadPatches().forEach patch@{
|
Patches.load(bundle).forEach patch@{
|
||||||
val patch = it()
|
val patch = it()
|
||||||
|
|
||||||
// TODO: filter out incompatible patches with package metadata
|
|
||||||
val filterOutPatches = true
|
val filterOutPatches = true
|
||||||
if (filterOutPatches && !patch.metadata.compatiblePackages.any { packageMetadata ->
|
if (filterOutPatches && !patch.metadata.compatiblePackages.any { packageMetadata ->
|
||||||
packageMetadata.name == packageName && packageMetadata.versions.any {
|
packageMetadata.name == packageName && packageMetadata.versions.any {
|
||||||
|
@ -1,25 +1,10 @@
|
|||||||
package app.revanced.patch
|
package app.revanced.patch
|
||||||
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.URL
|
|
||||||
import java.net.URLClassLoader
|
import java.net.URLClassLoader
|
||||||
|
|
||||||
internal class PatchLoader {
|
internal class PatchLoader {
|
||||||
internal companion object {
|
internal companion object {
|
||||||
internal fun injectPatches(file: File) {
|
|
||||||
// This function will fail on Java 9 and above.
|
|
||||||
try {
|
|
||||||
val url = file.toURI().toURL()
|
|
||||||
val classLoader = Thread.currentThread().contextClassLoader as URLClassLoader
|
|
||||||
val method = URLClassLoader::class.java.getDeclaredMethod("addURL", URL::class.java)
|
|
||||||
method.isAccessible = true
|
|
||||||
method.invoke(classLoader, url)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
throw Exception(
|
|
||||||
"Failed to inject patches! The CLI does NOT work on Java 9 and above, please use Java 8!",
|
|
||||||
e // propagate exception
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,15 +1,26 @@
|
|||||||
package app.revanced.patch
|
package app.revanced.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.base.Data
|
||||||
|
import app.revanced.patcher.patch.base.Patch
|
||||||
import app.revanced.patches.Index
|
import app.revanced.patches.Index
|
||||||
|
import java.io.File
|
||||||
|
import java.net.URLClassLoader
|
||||||
|
|
||||||
internal class Patches {
|
internal object Patches {
|
||||||
internal companion object {
|
|
||||||
// You may ask yourself, "why do this?".
|
|
||||||
// We do it like this, because we don't want the Index class
|
/**
|
||||||
// to be loaded while the dependency hasn't been injected yet.
|
* This method loads patches from a given patch file
|
||||||
// You can see this as "controlled class loading".
|
* @return the loaded patches represented as a list of functions returning instances of [Patch]
|
||||||
// Whenever this class is loaded (because it is invoked), all the imports
|
*/
|
||||||
// will be loaded too. We don't want to do this until we've injected the class.
|
internal fun load(patchFile: File): List<() -> Patch<Data>> {
|
||||||
internal fun loadPatches() = Index.patches
|
val url = patchFile.toURI().toURL()
|
||||||
|
val classLoader = URLClassLoader(arrayOf(url))
|
||||||
|
return loadIndex(classLoader).patches
|
||||||
}
|
}
|
||||||
}
|
private fun loadIndex(classLoader: ClassLoader) = classLoader
|
||||||
|
.loadClass(Index::class.java.canonicalName)
|
||||||
|
.fields
|
||||||
|
.first()
|
||||||
|
.get(null) as Index
|
||||||
|
}
|
||||||
|
@ -12,10 +12,7 @@ internal class FileSystemUtils(
|
|||||||
private var fileSystem: FileSystem
|
private var fileSystem: FileSystem
|
||||||
|
|
||||||
init {
|
init {
|
||||||
fileSystem = FileSystems.newFileSystem(
|
fileSystem = FileSystems.newFileSystem(file.toPath(), null as ClassLoader?)
|
||||||
file.toPath(),
|
|
||||||
null
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun deleteDirectory(dirPath: String) {
|
private fun deleteDirectory(dirPath: String) {
|
||||||
|
@ -91,7 +91,7 @@ object Signer {
|
|||||||
(keyStore.getKey(alias, PASSWORD) as PrivateKey)
|
(keyStore.getKey(alias, PASSWORD) as PrivateKey)
|
||||||
)
|
)
|
||||||
|
|
||||||
val zip = FileSystems.newFileSystem(apkFile.toPath(), null)
|
val zip = FileSystems.newFileSystem(apkFile.toPath(), null as ClassLoader?)
|
||||||
|
|
||||||
val dig = MessageDigest.getInstance("SHA1")
|
val dig = MessageDigest.getInstance("SHA1")
|
||||||
val digests: MutableMap<String, String> = LinkedHashMap()
|
val digests: MutableMap<String, String> = LinkedHashMap()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user