diff --git a/.gitignore b/.gitignore index a2de60d..efb0867 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,10 @@ hs_err_pid* # Generated files .idea/**/contentModel.xml +.idea/**/misc.xml +.idea/**/vcs.xml +.idea/**/kotlinc.xml +.idea/**/.gitignore # Sensitive or high-churn files .idea/**/dataSources/ diff --git a/build.gradle.kts b/build.gradle.kts index cb5bcf8..30dd1d9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,6 +11,7 @@ plugins { group = "app.revanced" repositories { + gradlePluginPortal() mavenCentral() google() } @@ -21,6 +22,7 @@ dependencies { implementation(libs.guava) implementation(libs.kotlin) implementation(libs.kotlin.android) + implementation(libs.shadow) implementation(gradleApi()) implementation(gradleKotlinDsl()) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f040071..5100348 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,6 +5,7 @@ binary-compatibility-validator = "0.15.1" #noinspection GradleDependency agp = "8.2.2" # 8.3.0 causes Java verifier error: https://github.com/ReVanced/revanced-patches/issues/2818 guava = "33.2.1-jre" +shadow = "8.1.1" [libraries] binary-compatibility-validator = { module = "org.jetbrains.kotlinx.binary-compatibility-validator:org.jetbrains.kotlinx.binary-compatibility-validator.gradle.plugin", version.ref = "binary-compatibility-validator" } @@ -12,6 +13,7 @@ kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = " kotlin-android = { module = "org.jetbrains.kotlin.android:org.jetbrains.kotlin.android.gradle.plugin", version.ref = "kotlin" } android-application = { module = "com.android.application:com.android.application.gradle.plugin", version.ref = "agp" } guava = { module = "com.google.guava:guava", version.ref = "guava" } +shadow = { group = "com.github.johnrengelman", name = "shadow", version.ref = "shadow" } [plugins] kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin"} diff --git a/src/main/kotlin/app/revanced/patches/gradle/PatchesPlugin.kt b/src/main/kotlin/app/revanced/patches/gradle/PatchesPlugin.kt index 4fe9a4d..b298874 100644 --- a/src/main/kotlin/app/revanced/patches/gradle/PatchesPlugin.kt +++ b/src/main/kotlin/app/revanced/patches/gradle/PatchesPlugin.kt @@ -6,6 +6,8 @@ import com.android.tools.r8.D8 import com.android.tools.r8.D8Command import com.android.tools.r8.OutputMode import com.android.tools.r8.utils.ArchiveResourceProvider +import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import kotlinx.validation.BinaryCompatibilityValidatorPlugin import org.gradle.api.JavaVersion import org.gradle.api.Plugin @@ -32,6 +34,7 @@ abstract class PatchesPlugin : Plugin { project.configureDependencies() project.configureKotlin() project.configureJava() + project.configureShadow() project.configureBinaryCompatibilityValidator() project.configureConsumeExtensions(extension) project.configureJarTask(extension) @@ -85,6 +88,13 @@ abstract class PatchesPlugin : Plugin { } } + /** + * Configures the shadow plugin + */ + private fun Project.configureShadow() { + pluginManager.apply(ShadowPlugin::class.java) + } + /** * Applies the binary compatibility validator plugin to the project, because patches have a public API. */ @@ -115,12 +125,13 @@ abstract class PatchesPlugin : Plugin { task.description = "Builds the project for Android by compiling to DEX and adding it to the patches file." task.group = "build" - task.dependsOn(tasks["jar"]) + // Should also execute all the tests like with normal `gradlew build` + task.dependsOn(tasks["build"]) task.doLast { val workingDirectory = layout.buildDirectory.dir("revanced").get().asFile.also(File::mkdirs) - val patchesFile = tasks["jar"].outputs.files.first() + val patchesFile = tasks["shadowJar"].outputs.files.first() val classesZipFile = workingDirectory.resolve("classes.zip") D8Command.builder() @@ -229,6 +240,11 @@ abstract class PatchesPlugin : Plugin { private fun Project.configureJarTask(patchesExtension: PatchesExtension) { tasks.withType(Jar::class.java).configureEach { it.archiveExtension.set("rvp") + + if (it.archiveClassifier.orNull.isNullOrEmpty()) { + it.archiveClassifier.set("thin"); + } + it.manifest.apply { attributes["Name"] = patchesExtension.about.name attributes["Description"] = patchesExtension.about.description @@ -241,4 +257,23 @@ private fun Project.configureJarTask(patchesExtension: PatchesExtension) { attributes["License"] = patchesExtension.about.license } } + + val shade = configurations.create("shade") + configurations.getByName("compileClasspath").extendsFrom(shade) + configurations.getByName("runtimeClasspath").extendsFrom(shade) + + tasks.withType(ShadowJar::class.java).configureEach { + it.configurations = listOf(shade) + it.archiveClassifier.set("") + + it.minimize() + it.isEnableRelocation = true + it.relocationPrefix = "app.revanced.patches" + } + tasks.named("assemble") { + it.dependsOn(tasks.named("shadowJar")) + } + tasks.named("jar") { + it.enabled = false + } }