forked from MinecraftForge/ForgeGradle
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathTaskReobfuscate.java
More file actions
257 lines (213 loc) · 6.75 KB
/
TaskReobfuscate.java
File metadata and controls
257 lines (213 loc) · 6.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
/*
* A Gradle plugin for the creation of Minecraft mods and MinecraftForge plugins.
* Copyright (C) 2013-2019 Minecraft Forge
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
package net.minecraftforge.gradle.patcher;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URLClassLoader;
import java.nio.charset.Charset;
import java.util.LinkedList;
import java.util.List;
import net.md_5.specialsource.Jar;
import net.md_5.specialsource.JarMapping;
import net.md_5.specialsource.JarRemapper;
import net.md_5.specialsource.provider.ClassLoaderProvider;
import net.md_5.specialsource.provider.JarProvider;
import net.md_5.specialsource.provider.JointProvider;
import net.minecraftforge.gradle.common.Constants;
import net.minecraftforge.gradle.util.mcp.ReobfExceptor;
import org.gradle.api.DefaultTask;
import org.gradle.api.file.FileCollection;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.InputFile;
import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction;
import com.google.common.collect.Lists;
import com.google.common.io.Files;
class TaskReobfuscate extends DefaultTask
{
//@formatter:off
@InputFile private Object inJar;
@InputFile private Object preFFJar;
@InputFile private Object srg;
@InputFile private Object exc;
@InputFile private Object methodsCsv;
@InputFile private Object fieldsCsv;
@OutputFile private Object outJar;
//@formatter: on
@Input
private LinkedList<String> extraSrg = new LinkedList<String>();
@InputFiles
private List<Object> libs = Lists.newArrayList();
//@formatter:off
public TaskReobfuscate() { super(); }
//@formatter:on
@TaskAction
public void doTask() throws IOException
{
File inJar = getInJar();
File srg = getSrg();
{
ReobfExceptor exceptor = new ReobfExceptor();
exceptor.toReobfJar = inJar;
exceptor.deobfJar = getPreFFJar();
exceptor.excConfig = getExc();
exceptor.fieldCSV = getFieldsCsv();
exceptor.methodCSV = getMethodsCsv();
File outSrg = new File(this.getTemporaryDir(), "reobf_cls.srg");
exceptor.doFirstThings();
exceptor.buildSrg(srg, outSrg);
srg = outSrg;
}
// append SRG
try (BufferedWriter writer = new BufferedWriter(new FileWriter(srg, true)))
{
for (String line : extraSrg)
{
writer.write(line);
writer.newLine();
}
}
obfuscate(inJar, getLibs(), srg);
}
private void obfuscate(File inJar, FileCollection classpath, File srg) throws FileNotFoundException, IOException
{
// load mapping
JarMapping mapping = new JarMapping();
mapping.loadMappings(Files.newReader(srg, Charset.defaultCharset()), null, null, false);
// make remapper
JarRemapper remapper = new JarRemapper(null, mapping);
// load jar
URLClassLoader classLoader = null;
try (Jar input = Jar.init(inJar))
{
// ensure that inheritance provider is used
JointProvider inheritanceProviders = new JointProvider();
inheritanceProviders.add(new JarProvider(input));
if (classpath != null && !classpath.isEmpty())
inheritanceProviders.add(new ClassLoaderProvider(classLoader = new URLClassLoader(Constants.toUrls(classpath))));
mapping.setFallbackInheritanceProvider(inheritanceProviders);
File out = getOutJar();
if (!out.getParentFile().exists()) //Needed because SS doesn't create it.
{
out.getParentFile().mkdirs();
}
// remap jar
remapper.remapJar(input, getOutJar());
}
finally
{
if (classLoader != null)
classLoader.close();
}
}
public File getInJar()
{
return getProject().file(inJar);
}
public void setInJar(Object inJar)
{
this.inJar = inJar;
}
public File getOutJar()
{
return getProject().file(outJar);
}
public void setOutJar(Object outJar)
{
this.outJar = outJar;
}
public File getPreFFJar()
{
return getProject().file(preFFJar);
}
public void setPreFFJar(Object preFFJar)
{
this.preFFJar = preFFJar;
}
public File getSrg()
{
return getProject().file(srg);
}
public void setSrg(Object srg)
{
this.srg = srg;
}
public File getExc()
{
return getProject().file(exc);
}
public void setExc(Object exc)
{
this.exc = exc;
}
public File getMethodsCsv()
{
return getProject().file(methodsCsv);
}
public void setMethodsCsv(Object methodsCsv)
{
this.methodsCsv = methodsCsv;
}
public File getFieldsCsv()
{
return getProject().file(fieldsCsv);
}
public void setFieldsCsv(Object fieldsCsv)
{
this.fieldsCsv = fieldsCsv;
}
public LinkedList<String> getExtraSrg()
{
return extraSrg;
}
public void setExtraSrg(LinkedList<String> extraSrg)
{
this.extraSrg = extraSrg;
}
public FileCollection getLibs()
{
FileCollection collection = null;
for (Object o : libs)
{
FileCollection col;
if (o instanceof FileCollection)
{
col = (FileCollection) o;
}
else
{
col = getProject().files(o);
}
if (collection == null)
collection = col;
else
collection = collection.plus(col);
}
return collection;
}
public void addLibs(Object libs)
{
this.libs.add(libs);
}
}