Skip to content

Commit 4cdced7

Browse files
committed
Added runtime obfuscator dependnecy fetching on compile
1 parent 703d840 commit 4cdced7

7 files changed

Lines changed: 174 additions & 22 deletions

File tree

dev.skidfuscator.gradle-plugin/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,5 @@ dependencies {
3737
compileOnly gradleApi()
3838
compileOnly 'org.codehaus.groovy:groovy-all:3.0.9'
3939

40-
implementation project(':obfuscator')
4140
implementation 'commons-io:commons-io:2.11.0'
4241
}
Lines changed: 67 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,85 @@
11
package dev.skidfuscator.gradle;
22

3-
import dev.skidfuscator.obfuscator.Skidfuscator;
4-
import dev.skidfuscator.obfuscator.SkidfuscatorSession;
53
import org.gradle.api.Action;
64
import org.gradle.api.Task;
5+
import org.gradle.api.file.FileCollection;
76

87
import javax.inject.Inject;
8+
import java.io.File;
9+
import java.io.IOException;
10+
import java.lang.reflect.Constructor;
11+
import java.lang.reflect.InvocationTargetException;
12+
import java.lang.reflect.Method;
13+
import java.net.URL;
14+
import java.net.URLClassLoader;
15+
import java.util.ArrayList;
916
import java.util.List;
1017

1118
public class SkidfuscatorCompileAction implements Action<Task> {
1219

13-
private final SkidfuscatorSession session;
14-
private final List<String> excludes;
20+
private final SkidfuscatorSpec spec;
21+
private final SkidfuscatorRuntime runtime;
1522

1623
@Inject
17-
public SkidfuscatorCompileAction(SkidfuscatorSession session, List<String> exemptionString) {
18-
this.session = session;
19-
this.excludes = exemptionString;
24+
public SkidfuscatorCompileAction(SkidfuscatorSpec spec, SkidfuscatorRuntime runtime) {
25+
this.spec = spec;
26+
this.runtime = runtime;
2027
}
2128

2229
@Override
2330
public void execute(Task task) {
24-
Skidfuscator skidfuscator = new Skidfuscator(this.session);
25-
this.excludes.forEach(exclude -> skidfuscator.getExemptAnalysis().add(exclude));
26-
skidfuscator.run();
31+
try {
32+
this.executeObfuscator();
33+
} catch (Throwable throwable) {
34+
throw new IllegalStateException("Failed to compile with skidfuscator", throwable);
35+
}
36+
}
37+
38+
private void executeObfuscator() throws IOException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
39+
FileCollection fileCollection = runtime.fetchClasspath();
40+
List<URL> urls = new ArrayList<>();
41+
for (File file : fileCollection)
42+
urls.add(file.toURI().toURL());
43+
44+
try (URLClassLoader classLoader = new URLClassLoader(urls.toArray(new URL[0]))) {
45+
Class<?> sessionClass = classLoader.loadClass("dev.skidfuscator.obfuscator.SkidfuscatorSession");
46+
Class<?> obfuscatorClass = classLoader.loadClass("dev.skidfuscator.obfuscator.Skidfuscator");
47+
Object session = this.buildSkidfuscatorSession(sessionClass);
48+
Object obfuscator = obfuscatorClass.getDeclaredConstructor(sessionClass).newInstance(session);
49+
50+
this.addToExemptAnalysis(obfuscator);
51+
52+
// run obfuscator!
53+
Method run = obfuscator.getClass().getMethod("run");
54+
run.invoke(obfuscator);
55+
}
56+
}
57+
58+
private void addToExemptAnalysis(Object obfuscator) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
59+
Class<?> obfuscatorClass = obfuscator.getClass();
60+
Method getExemptAnalysis = obfuscatorClass.getMethod("getExemptAnalysis");
61+
Object exemptAnalysis = getExemptAnalysis.invoke(obfuscator);
62+
63+
Method method = exemptAnalysis.getClass().getMethod("add", String.class);
64+
for (String exclude : this.spec.getExcludes())
65+
method.invoke(exemptAnalysis, exclude);
66+
}
67+
68+
private Object buildSkidfuscatorSession(Class<?> aClass) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
69+
Constructor<?> constructor = aClass.getDeclaredConstructor(
70+
File.class, // input
71+
File.class, // output
72+
File[].class, // libs
73+
File.class, // mappings
74+
File.class, // exempt
75+
File.class, // runtime
76+
boolean.class, // phantom
77+
boolean.class, // jmod
78+
boolean.class, // fuckit
79+
boolean.class // analytics
80+
);
81+
return constructor.newInstance(
82+
spec.getInput(), spec.getOutput(), spec.getLibs(), spec.getMappings(), spec.getExempt(), spec.getRuntime(),
83+
spec.isPhantom(), spec.isJmod(), spec.isFuckit(), spec.isAnalytics());
2784
}
2885
}

dev.skidfuscator.gradle-plugin/src/main/java/dev/skidfuscator/gradle/SkidfuscatorExtension.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
@Getter
1212
public class SkidfuscatorExtension {
1313

14+
private final Property<String> version;
1415
private final Property<Boolean> phantom;
1516
private final Property<Boolean> notrack;
1617
private final Property<Boolean> fuckit;
@@ -21,6 +22,7 @@ public class SkidfuscatorExtension {
2122

2223
@Inject
2324
public SkidfuscatorExtension(ObjectFactory objectFactory) {
25+
this.version = objectFactory.property(String.class).convention("2.0.0-SNAPSHOT"); // automatically fetching?
2426
this.phantom = objectFactory.property(Boolean.class).convention(false);
2527
this.notrack = objectFactory.property(Boolean.class).convention(false);
2628
this.fuckit = objectFactory.property(Boolean.class).convention(false);

dev.skidfuscator.gradle-plugin/src/main/java/dev/skidfuscator/gradle/SkidfuscatorGradlePlugin.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package dev.skidfuscator.gradle;
22

3-
import dev.skidfuscator.obfuscator.SkidfuscatorSession;
4-
import dev.skidfuscator.obfuscator.util.MiscUtil;
3+
import dev.skidfuscator.gradle.util.MiscUtil;
54
import org.apache.commons.io.FilenameUtils;
65
import org.gradle.api.Plugin;
76
import org.gradle.api.Project;
@@ -15,7 +14,6 @@
1514

1615
import java.io.File;
1716
import java.util.ArrayList;
18-
import java.util.Collections;
1917
import java.util.List;
2018

2119
public class SkidfuscatorGradlePlugin implements Plugin<Project> {
@@ -43,13 +41,13 @@ private void handle(Project project, SkidfuscatorExtension extension) {
4341
// compute session and obfuscate right after jar task
4442
project.getTasks().withType(Jar.class, jar -> {
4543
final String home = System.getProperty("java.home");
46-
final File runtime;
44+
final File javaRuntime;
4745
final File exemption;
4846

4947
if (extension.getRuntime().isPresent()) {
50-
runtime = extension.getRuntime().get().getAsFile();
48+
javaRuntime = extension.getRuntime().get().getAsFile();
5149
} else {
52-
runtime = new File(
50+
javaRuntime = new File(
5351
home,
5452
MiscUtil.getJavaVersion() > 8
5553
? "jmods"
@@ -67,23 +65,25 @@ private void handle(Project project, SkidfuscatorExtension extension) {
6765
File directory = input.getParentFile();
6866

6967
File output = new File(directory, FilenameUtils.getName(input.getName()) + extension.getClassifier().get() + FilenameUtils.getExtension(input.getName()));
70-
SkidfuscatorSession session = SkidfuscatorSession.builder()
68+
SkidfuscatorSpec spec = SkidfuscatorSpec.builder()
7169
.input(input)
7270
.output(output)
7371
.fuckit(extension.getFuckit().get())
7472
.phantom(extension.getPhantom().get())
7573
.analytics(!extension.getNotrack().get())
76-
.runtime(runtime)
74+
.runtime(javaRuntime)
7775
.exempt(exemption)
7876
.jmod(this.jvm > 8)
7977
.libs(this.classpath.toArray(new File[0]))
78+
.excludes(extension.getExcludes().getOrNull())
8079
.build();
81-
80+
SkidfuscatorRuntime runtime = new SkidfuscatorRuntime(project, extension.getVersion().get());
8281
SkidfuscatorCompileAction action = project.getObjects().newInstance(
8382
SkidfuscatorCompileAction.class,
84-
session,
85-
extension.getExcludes().getOrElse(Collections.emptyList())
83+
spec,
84+
runtime
8685
);
86+
8787
jar.doLast("skidfuscator", action);
8888
});
8989
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package dev.skidfuscator.gradle;
2+
3+
import org.gradle.api.Project;
4+
import org.gradle.api.artifacts.Configuration;
5+
import org.gradle.api.artifacts.Dependency;
6+
import org.gradle.api.file.FileCollection;
7+
import org.gradle.api.internal.file.collections.LazilyInitializedFileCollection;
8+
import org.gradle.api.internal.project.ProjectInternal;
9+
import org.gradle.api.plugins.jvm.internal.JvmEcosystemUtilities;
10+
11+
public class SkidfuscatorRuntime {
12+
13+
private static final String NOTATION = "dev.skidfuscator.community:obfuscator:%s";
14+
15+
private final ProjectInternal project;
16+
private final String version;
17+
18+
public SkidfuscatorRuntime(Project project, String version) {
19+
this.project = (ProjectInternal) project;
20+
this.version = version;
21+
}
22+
23+
public FileCollection fetchClasspath() {
24+
return new LazilyInitializedFileCollection() {
25+
@Override
26+
public String getDisplayName() {
27+
return "Skidobfuscator runtime classpath";
28+
}
29+
30+
@Override
31+
public FileCollection createDelegate() {
32+
Dependency dependency = project.getDependencies().create(String.format(NOTATION, version));
33+
34+
return detachedRuntimeClasspath(dependency);
35+
}
36+
37+
private Configuration detachedRuntimeClasspath(Dependency... dependencies) {
38+
Configuration classpath = project.getConfigurations().detachedConfiguration(dependencies);
39+
jvmEcosystemUtilities().configureAsRuntimeClasspath(classpath);
40+
return classpath;
41+
}
42+
};
43+
}
44+
45+
private JvmEcosystemUtilities jvmEcosystemUtilities() {
46+
return project.getServices().get(JvmEcosystemUtilities.class);
47+
}
48+
49+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package dev.skidfuscator.gradle;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
import java.io.File;
7+
import java.util.List;
8+
9+
@Builder
10+
@Getter
11+
public class SkidfuscatorSpec {
12+
private File input;
13+
private File output;
14+
private File[] libs;
15+
private File mappings;
16+
private File exempt;
17+
private File runtime;
18+
private List<String> excludes;
19+
private boolean phantom;
20+
private boolean jmod;
21+
private boolean fuckit;
22+
private boolean analytics;
23+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package dev.skidfuscator.gradle.util;
2+
3+
import lombok.experimental.UtilityClass;
4+
5+
@UtilityClass
6+
public class MiscUtil {
7+
8+
public int getJavaVersion() {
9+
String version = System.getProperty("java.version");
10+
return decodeJvmVersion(version);
11+
}
12+
13+
public int decodeJvmVersion(String version) {
14+
if(version.startsWith("1.")) {
15+
version = version.substring(2, 3);
16+
} else {
17+
int dot = version.indexOf(".");
18+
if(dot != -1) { version = version.substring(0, dot); }
19+
} return Integer.parseInt(version);
20+
}
21+
22+
}

0 commit comments

Comments
 (0)