Merge pull request #10 from revanced/dev

feat: support java version 9+
This commit is contained in:
oSumAtrIX 2022-05-07 21:25:28 +02:00 committed by GitHub
commit 46c275feb5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 43 additions and 41 deletions

View File

@ -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

View File

@ -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)

View File

@ -1,2 +1,2 @@
kotlin.code.style = official kotlin.code.style = official
version = 1.0.1 version = 1.1.0-dev.1

View File

@ -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)
} }
} }

View File

@ -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 {

View File

@ -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
)
}
}
} }
} }

View File

@ -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
}

View File

@ -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) {

View File

@ -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()