Skip to content

Commit 14fa55d

Browse files
committed
Initial implementation for skidfuscator gradle plugin
1 parent 291445b commit 14fa55d

7 files changed

Lines changed: 197 additions & 1 deletion

File tree

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ mappings/*
4444
*.jar
4545
**/dependency-reduced-pom.xml
4646

47-
gradle
47+
/gradle/
4848
**/build/
4949
!src/**/build/
5050

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
plugins {
2+
id 'java-gradle-plugin'
3+
id 'com.gradle.plugin-publish' version '0.14.0'
4+
}
5+
6+
version = '0.1'
7+
8+
gradlePlugin {
9+
plugins {
10+
skidfuscator {
11+
id = 'dev.skidfuscator'
12+
implementationClass = 'dev.skidfuscator.gradle.SkidfuscatorGradlePlugin'
13+
}
14+
}
15+
}
16+
17+
pluginBundle {
18+
tags = ['obfuscator']
19+
20+
plugins {
21+
skidfuscator {
22+
displayName = 'Skidfuscator Gradle Plugin'
23+
description = 'The skidfuscator gradle plugin that will automatically obfuscates your jar on compile.'
24+
website = 'https://github.com/terminalsin/skidfuscator-java-obfuscator'
25+
vcsUrl = 'https://github.com/terminalsin/skidfuscator-java-obfuscator'
26+
}
27+
}
28+
}
29+
30+
dependencies {
31+
compileOnly gradleApi()
32+
compileOnly 'org.codehaus.groovy:groovy-all:3.0.9'
33+
34+
implementation project(':obfuscator')
35+
implementation 'commons-io:commons-io:2.11.0'
36+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package dev.skidfuscator.gradle;
2+
3+
import dev.skidfuscator.obfuscator.Skidfuscator;
4+
import dev.skidfuscator.obfuscator.SkidfuscatorSession;
5+
import lombok.RequiredArgsConstructor;
6+
import org.gradle.api.Action;
7+
import org.gradle.api.Task;
8+
import org.gradle.api.tasks.compile.AbstractCompile;
9+
10+
@RequiredArgsConstructor
11+
public class SkidfuscatorCompileAction implements Action<Task> {
12+
13+
private final SkidfuscatorSession session;
14+
private final String exemptionString;
15+
16+
@Override
17+
public void execute(Task task) {
18+
this.handleCompileTask((AbstractCompile) task);
19+
}
20+
21+
public void handleCompileTask(AbstractCompile compile) {
22+
Skidfuscator skidfuscator = new Skidfuscator(this.session);
23+
if (this.exemptionString != null)
24+
skidfuscator.getExemptAnalysis().add(this.exemptionString);
25+
skidfuscator.run();
26+
}
27+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package dev.skidfuscator.gradle;
2+
3+
import lombok.Getter;
4+
import org.gradle.api.file.RegularFile;
5+
import org.gradle.api.model.ObjectFactory;
6+
import org.gradle.api.provider.Property;
7+
8+
import javax.inject.Inject;
9+
10+
@Getter
11+
public class SkidfuscatorExtension {
12+
13+
private final Property<Boolean> phantom;
14+
private final Property<Boolean> notrack;
15+
private final Property<Boolean> fuckit;
16+
private final Property<String> classifier;
17+
private final Property<String> exemptionString;
18+
private final Property<RegularFile> runtime;
19+
private final Property<RegularFile> exemption;
20+
21+
@Inject
22+
public SkidfuscatorExtension(ObjectFactory objectFactory) {
23+
this.phantom = objectFactory.property(Boolean.class).convention(false);
24+
this.notrack = objectFactory.property(Boolean.class).convention(false);
25+
this.fuckit = objectFactory.property(Boolean.class).convention(false);
26+
this.runtime = objectFactory.property(RegularFile.class);
27+
this.classifier = objectFactory.property(String.class).convention("-obfuscated");
28+
this.exemptionString = objectFactory.property(String.class);
29+
this.exemption = objectFactory.property(RegularFile.class);
30+
}
31+
32+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package dev.skidfuscator.gradle;
2+
3+
import dev.skidfuscator.obfuscator.SkidfuscatorSession;
4+
import dev.skidfuscator.obfuscator.util.MiscUtil;
5+
import org.apache.commons.io.FilenameUtils;
6+
import org.gradle.api.Plugin;
7+
import org.gradle.api.Project;
8+
import org.gradle.api.plugins.GroovyPlugin;
9+
import org.gradle.api.plugins.JavaPlugin;
10+
import org.gradle.api.plugins.JavaPluginExtension;
11+
import org.gradle.api.plugins.scala.ScalaPlugin;
12+
import org.gradle.api.tasks.SourceSetContainer;
13+
import org.gradle.api.tasks.compile.AbstractCompile;
14+
import org.gradle.jvm.tasks.Jar;
15+
16+
import java.io.File;
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
20+
public class SkidfuscatorGradlePlugin implements Plugin<Project> {
21+
22+
private List<File> classpath;
23+
private SourceSetContainer sourceSets;
24+
private int jvm;
25+
26+
@Override
27+
public void apply(Project project) {
28+
SkidfuscatorExtension extension = project.getExtensions().create("skidfuscator", SkidfuscatorExtension.class);
29+
30+
this.sourceSets = project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets();
31+
this.classpath = new ArrayList<>();
32+
this.jvm = 8;
33+
project.afterEvaluate(p -> this.handle(p, extension));
34+
}
35+
36+
private void handle(Project project, SkidfuscatorExtension extension) {
37+
// read jvm and classpath information directly from language's compile task
38+
project.getPlugins().withType(JavaPlugin.class, plugin -> this.handlePlugin(project, "java"));
39+
project.getPlugins().withType(GroovyPlugin.class, plugin -> this.handlePlugin(project, "groovy"));
40+
project.getPlugins().withType(ScalaPlugin.class, plugin -> this.handlePlugin(project, "scala"));
41+
project.getPlugins().withId("org.jetbrains.kotlin.jvm", plugin -> this.handlePlugin(project, "kotlin"));
42+
// compute session and obfuscator right after jar task
43+
project.getTasks().withType(Jar.class, jar -> {
44+
final String home = System.getProperty("java.home");
45+
final File runtime;
46+
final File exemption;
47+
48+
if (extension.getRuntime().isPresent()) {
49+
runtime = extension.getRuntime().get().getAsFile();
50+
} else {
51+
runtime = new File(
52+
home,
53+
MiscUtil.getJavaVersion() > 8
54+
? "jmods"
55+
: "lib/rt.jar"
56+
);
57+
}
58+
59+
if (extension.getExemption().isPresent()) {
60+
exemption = extension.getExemption().get().getAsFile();;
61+
} else {
62+
exemption = null;
63+
}
64+
65+
File input = jar.getArchiveFile().get().getAsFile();
66+
File directory = input.getParentFile();
67+
68+
File output = new File(directory, FilenameUtils.getName(input.getName()) + extension.getClassifier().get() + FilenameUtils.getExtension(input.getName()));
69+
SkidfuscatorSession session = SkidfuscatorSession.builder()
70+
.input(input)
71+
.output(output)
72+
.fuckit(extension.getFuckit().get())
73+
.phantom(extension.getPhantom().get())
74+
.analytics(!extension.getNotrack().get())
75+
.runtime(runtime)
76+
.exempt(exemption)
77+
.jmod(this.jvm > 8)
78+
.libs(this.classpath.toArray(new File[0]))
79+
.build();
80+
81+
SkidfuscatorCompileAction action = project.getObjects().newInstance(SkidfuscatorCompileAction.class, session, extension.getExemptionString().getOrNull());
82+
jar.doLast("skidfuscator", action);
83+
});
84+
}
85+
86+
private void handlePlugin(Project project, String language) {
87+
sourceSets.all(sourceSet -> {
88+
project.getTasks().named(sourceSet.getCompileTaskName(language), AbstractCompile.class, compile -> {
89+
this.jvm = MiscUtil.decodeJvmVersion(compile.getTargetCompatibility());
90+
this.classpath.addAll(compile.getClasspath().getFiles());
91+
});
92+
});
93+
}
94+
95+
}

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/util/MiscUtil.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ public String replaceColor(final String string, final String replace, final Stri
3838

3939
public int getJavaVersion() {
4040
String version = System.getProperty("java.version");
41+
return decodeJvmVersion(version);
42+
}
43+
44+
public int decodeJvmVersion(String version) {
4145
if(version.startsWith("1.")) {
4246
version = version.substring(2, 3);
4347
} else {

settings.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,13 @@ void initBase() {
4141
include ':commons'
4242
include ':obfuscator'
4343
include ':client-standalone'
44+
include ':gradle-plugin'
4445

4546
project(":annotations").projectDir = file('dev.skidfuscator.annotations')
4647
project(":commons").projectDir = file('dev.skidfuscator.commons')
4748
project(":obfuscator").projectDir = file('dev.skidfuscator.obfuscator')
4849
project(":client-standalone").projectDir = file('dev.skidfuscator.client.standalone')
50+
project(":gradle-plugin").projectDir = file('dev.skidfuscator.gradle-plugin')
4951
}
5052

5153
initMaple()

0 commit comments

Comments
 (0)