diff options
| author | 2018-07-06 13:03:02 +0800 | |
|---|---|---|
| committer | 2018-07-06 13:03:02 +0800 | |
| commit | 027d79e46569321d7fe2d1049a512bf59370a47f (patch) | |
| tree | 20e8b9b7d5bd00f28f001411da57697ac7324401 /src/main/java/cuchaz/enigma/Deobfuscator.java | |
| parent | make isMethodProvider public (diff) | |
| download | enigma-fork-027d79e46569321d7fe2d1049a512bf59370a47f.tar.gz enigma-fork-027d79e46569321d7fe2d1049a512bf59370a47f.tar.xz enigma-fork-027d79e46569321d7fe2d1049a512bf59370a47f.zip | |
speed up Deobfuscator's getSources by using a single TranslatingTypeloader and caching the ClassLoaderTypeloader
Diffstat (limited to 'src/main/java/cuchaz/enigma/Deobfuscator.java')
| -rw-r--r-- | src/main/java/cuchaz/enigma/Deobfuscator.java | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java index 0e03753..cb02ffa 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java | |||
| @@ -15,6 +15,7 @@ import com.google.common.base.Stopwatch; | |||
| 15 | import com.google.common.collect.Lists; | 15 | import com.google.common.collect.Lists; |
| 16 | import com.google.common.collect.Maps; | 16 | import com.google.common.collect.Maps; |
| 17 | import com.google.common.collect.Sets; | 17 | import com.google.common.collect.Sets; |
| 18 | import com.strobel.assembler.metadata.Buffer; | ||
| 18 | import com.strobel.assembler.metadata.MetadataSystem; | 19 | import com.strobel.assembler.metadata.MetadataSystem; |
| 19 | import com.strobel.assembler.metadata.TypeDefinition; | 20 | import com.strobel.assembler.metadata.TypeDefinition; |
| 20 | import com.strobel.assembler.metadata.TypeReference; | 21 | import com.strobel.assembler.metadata.TypeReference; |
| @@ -163,6 +164,10 @@ public class Deobfuscator { | |||
| 163 | } | 164 | } |
| 164 | 165 | ||
| 165 | public CompilationUnit getSourceTree(String className) { | 166 | public CompilationUnit getSourceTree(String className) { |
| 167 | return getSourceTree(className, createTypeLoader()); | ||
| 168 | } | ||
| 169 | |||
| 170 | public CompilationUnit getSourceTree(String className, ITranslatingTypeLoader loader) { | ||
| 166 | 171 | ||
| 167 | // we don't know if this class name is obfuscated or deobfuscated | 172 | // we don't know if this class name is obfuscated or deobfuscated |
| 168 | // we need to tell the decompiler the deobfuscated name so it doesn't get freaked out | 173 | // we need to tell the decompiler the deobfuscated name so it doesn't get freaked out |
| @@ -178,7 +183,6 @@ public class Deobfuscator { | |||
| 178 | } | 183 | } |
| 179 | 184 | ||
| 180 | // set the desc loader | 185 | // set the desc loader |
| 181 | TranslatingTypeLoader loader = createTypeLoader(); | ||
| 182 | this.settings.setTypeLoader(loader); | 186 | this.settings.setTypeLoader(loader); |
| 183 | 187 | ||
| 184 | // see if procyon can find the desc | 188 | // see if procyon can find the desc |
| @@ -267,6 +271,10 @@ public class Deobfuscator { | |||
| 267 | progress.init(classEntries.size(), "Decompiling classes..."); | 271 | progress.init(classEntries.size(), "Decompiling classes..."); |
| 268 | } | 272 | } |
| 269 | 273 | ||
| 274 | //create a common instance outside the loop as mappings shouldn't be changing while this is happening | ||
| 275 | //synchronized to make sure the parallelStream doesn't CME with the cache | ||
| 276 | ITranslatingTypeLoader typeLoader = new SynchronizedTypeLoader(createTypeLoader()); | ||
| 277 | |||
| 270 | // DEOBFUSCATE ALL THE THINGS!! @_@ | 278 | // DEOBFUSCATE ALL THE THINGS!! @_@ |
| 271 | Stopwatch stopwatch = Stopwatch.createStarted(); | 279 | Stopwatch stopwatch = Stopwatch.createStarted(); |
| 272 | AtomicInteger count = new AtomicInteger(); | 280 | AtomicInteger count = new AtomicInteger(); |
| @@ -278,7 +286,7 @@ public class Deobfuscator { | |||
| 278 | 286 | ||
| 279 | try { | 287 | try { |
| 280 | // get the source | 288 | // get the source |
| 281 | CompilationUnit sourceTree = getSourceTree(obfClassEntry.getName()); | 289 | CompilationUnit sourceTree = getSourceTree(obfClassEntry.getName(), typeLoader); |
| 282 | 290 | ||
| 283 | // write the file | 291 | // write the file |
| 284 | File file = new File(dirOut, deobfClassEntry.getName().replace('.', '/') + ".java"); | 292 | File file = new File(dirOut, deobfClassEntry.getName().replace('.', '/') + ".java"); |
| @@ -295,7 +303,7 @@ public class Deobfuscator { | |||
| 295 | } | 303 | } |
| 296 | }); | 304 | }); |
| 297 | stopwatch.stop(); | 305 | stopwatch.stop(); |
| 298 | System.out.println("Done in : " + stopwatch.toString()); | 306 | System.out.println("writeSources Done in : " + stopwatch.toString()); |
| 299 | if (progress != null) { | 307 | if (progress != null) { |
| 300 | progress.onProgress(count.get(), "Done:"); | 308 | progress.onProgress(count.get(), "Done:"); |
| 301 | } | 309 | } |
| @@ -658,4 +666,32 @@ public class Deobfuscator { | |||
| 658 | public interface ClassTransformer { | 666 | public interface ClassTransformer { |
| 659 | String transform(ClassNode node, ClassWriter writer); | 667 | String transform(ClassNode node, ClassWriter writer); |
| 660 | } | 668 | } |
| 669 | |||
| 670 | private class SynchronizedTypeLoader implements ITranslatingTypeLoader { | ||
| 671 | private final TranslatingTypeLoader delegate; | ||
| 672 | |||
| 673 | private SynchronizedTypeLoader(TranslatingTypeLoader delegate) { | ||
| 674 | this.delegate = delegate; | ||
| 675 | } | ||
| 676 | |||
| 677 | @Override | ||
| 678 | public List<String> getClassNamesToTry(String className) { | ||
| 679 | return delegate.getClassNamesToTry(className); | ||
| 680 | } | ||
| 681 | |||
| 682 | @Override | ||
| 683 | public List<String> getClassNamesToTry(ClassEntry obfClassEntry) { | ||
| 684 | return delegate.getClassNamesToTry(obfClassEntry); | ||
| 685 | } | ||
| 686 | |||
| 687 | @Override | ||
| 688 | public String transformInto(ClassNode node, ClassWriter writer) { | ||
| 689 | return delegate.transformInto(node, writer); | ||
| 690 | } | ||
| 691 | |||
| 692 | @Override | ||
| 693 | public synchronized boolean tryLoadType(String internalName, Buffer buffer) { | ||
| 694 | return delegate.tryLoadType(internalName, buffer); | ||
| 695 | } | ||
| 696 | } | ||
| 661 | } | 697 | } |