1 22 package proguard.obfuscate; 23 24 import proguard.*; 25 import proguard.classfile.*; 26 import proguard.classfile.constant.visitor.AllConstantVisitor; 27 import proguard.classfile.editor.*; 28 import proguard.classfile.util.*; 29 import proguard.classfile.visitor.*; 30 31 import java.io.*; 32 import java.util.*; 33 34 40 public class Obfuscator 41 { 42 private Configuration configuration; 43 44 45 48 public Obfuscator(Configuration configuration) 49 { 50 this.configuration = configuration; 51 } 52 53 54 57 public void execute(ClassPool programClassPool, 58 ClassPool libraryClassPool) throws IOException 59 { 60 if (configuration.keep == null && 62 configuration.applyMapping == null && 63 configuration.printMapping == null) 64 { 65 throw new IOException("You have to specify '-keep' options for the obfuscation step."); 66 } 67 68 programClassPool.classesAccept(new ClassCleaner()); 70 libraryClassPool.classesAccept(new ClassCleaner()); 71 72 ClassVisitor memberInfoLinker = 76 configuration.useUniqueClassMemberNames ? 77 (ClassVisitor)new AllMemberVisitor(new MethodLinker()) : 78 (ClassVisitor)new BottomClassFilter(new MethodLinker()); 79 80 programClassPool.classesAccept(memberInfoLinker); 81 libraryClassPool.classesAccept(memberInfoLinker); 82 83 NameMarker nameMarker = new NameMarker(); 85 ClassPoolVisitor classPoolvisitor = 86 ClassSpecificationVisitorFactory.createClassPoolVisitor(configuration.keep, 87 nameMarker, 88 nameMarker, 89 false, 90 false, 91 true); 92 programClassPool.accept(classPoolvisitor); 94 libraryClassPool.accept(classPoolvisitor); 95 96 libraryClassPool.classesAccept(nameMarker); 98 libraryClassPool.classesAccept(new AllMemberVisitor(nameMarker)); 99 100 if (configuration.applyMapping != null) 103 { 104 WarningPrinter warningPrinter = configuration.warn ? 105 new WarningPrinter(System.err) : 106 null; 107 108 MappingReader reader = new MappingReader(configuration.applyMapping); 109 110 MappingProcessor keeper = 111 new MultiMappingProcessor(new MappingProcessor[] 112 { 113 new MappingKeeper(programClassPool, warningPrinter), 114 new MappingKeeper(libraryClassPool, null), 115 }); 116 117 reader.pump(keeper); 118 119 if (configuration.warn) 120 { 121 int mappingWarningCount = warningPrinter.getWarningCount(); 123 if (mappingWarningCount > 0) 124 { 125 System.err.println("Warning: there were " + mappingWarningCount + 126 " kept classes and class members that were remapped anyway."); 127 System.err.println(" You should adapt your configuration or edit the mapping file."); 128 129 if (!configuration.ignoreWarnings) 130 { 131 System.err.println(" If you are sure this remapping won't hurt,"); 132 System.err.println(" you could try your luck using the '-ignorewarnings' option."); 133 throw new IOException("Please correct the above warnings first."); 134 } 135 } 136 } 137 } 138 139 AttributeUsageMarker attributeUsageMarker = new AttributeUsageMarker(); 141 if (configuration.keepAttributes != null) 142 { 143 if (!configuration.keepAttributes.isEmpty()) 144 { 145 attributeUsageMarker.setKeepAttributes(configuration.keepAttributes); 146 } 147 else 148 { 149 attributeUsageMarker.setKeepAllAttributes(); 150 } 151 } 152 programClassPool.classesAccept(attributeUsageMarker); 153 154 programClassPool.classesAccept(new AttributeShrinker()); 156 157 programClassPool.classesAccept(new ClassObfuscator(programClassPool, 159 configuration.useMixedCaseClassNames, 160 configuration.flattenPackageHierarchy, 161 configuration.repackageClasses, 162 configuration.allowAccessModification)); 163 164 NameFactory nameFactory = new SimpleNameFactory(); 166 167 if (configuration.obfuscationDictionary != null) 168 { 169 nameFactory = new DictionaryNameFactory(configuration.obfuscationDictionary, 170 nameFactory); 171 } 172 173 WarningPrinter warningPrinter = configuration.warn ? 174 new WarningPrinter(System.err) : 175 null; 176 177 Map descriptorMap = new HashMap(); 179 180 if (configuration.useUniqueClassMemberNames) 182 { 183 programClassPool.classesAccept( 185 new AllMemberVisitor( 186 new MemberNameCollector(configuration.overloadAggressively, 187 descriptorMap))); 188 189 programClassPool.classesAccept( 191 new AllMemberVisitor( 192 new MemberObfuscator(configuration.overloadAggressively, 193 nameFactory, 194 descriptorMap))); 195 } 196 else 197 { 198 programClassPool.classesAccept( 200 new MultiClassVisitor(new ClassVisitor[] 201 { 202 new ClassHierarchyTraveler(true, false, false, true, 205 new AllMemberVisitor( 206 new MemberAccessFilter(ClassConstants.INTERNAL_ACC_PRIVATE, 0, 207 new MemberNameCollector(configuration.overloadAggressively, 208 descriptorMap)))), 209 210 new ClassHierarchyTraveler(true, true, true, true, 212 new AllMemberVisitor( 213 new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE, 214 new MemberNameCollector(configuration.overloadAggressively, 215 descriptorMap)))), 216 217 new AllMemberVisitor( 219 new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE, 220 new MemberObfuscator(configuration.overloadAggressively, 221 nameFactory, 222 descriptorMap))), 223 224 new MapCleaner(descriptorMap) 226 })); 227 228 programClassPool.classesAccept( 230 new MultiClassVisitor(new ClassVisitor[] 231 { 232 new AllMemberVisitor( 234 new MemberNameCollector(configuration.overloadAggressively, 235 descriptorMap)), 236 237 new ClassHierarchyTraveler(false, true, true, false, 239 new AllMemberVisitor( 240 new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE, 241 new MemberNameCollector(configuration.overloadAggressively, 242 descriptorMap)))), 243 244 new AllMemberVisitor( 246 new MemberAccessFilter(ClassConstants.INTERNAL_ACC_PRIVATE, 0, 247 new MemberObfuscator(configuration.overloadAggressively, 248 nameFactory, 249 descriptorMap))), 250 251 new MapCleaner(descriptorMap) 253 })); 254 } 255 256 NameFactory specialNameFactory = 259 new SpecialNameFactory(new SimpleNameFactory()); 260 261 Map specialDescriptorMap = new HashMap(); 264 265 programClassPool.classesAccept( 266 new AllMemberVisitor( 267 new MemberSpecialNameFilter( 268 new MemberNameCollector(configuration.overloadAggressively, 269 specialDescriptorMap)))); 270 271 libraryClassPool.classesAccept( 272 new AllMemberVisitor( 273 new MemberSpecialNameFilter( 274 new MemberNameCollector(configuration.overloadAggressively, 275 specialDescriptorMap)))); 276 277 programClassPool.classesAccept( 279 new MultiClassVisitor(new ClassVisitor[] 280 { 281 new ClassHierarchyTraveler(true, false, false, true, 284 new AllMemberVisitor( 285 new MemberAccessFilter(ClassConstants.INTERNAL_ACC_PRIVATE, 0, 286 new MemberNameCollector(configuration.overloadAggressively, 287 descriptorMap)))), 288 289 new ClassHierarchyTraveler(true, true, true, true, 291 new AllMemberVisitor( 292 new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE, 293 new MemberNameCollector(configuration.overloadAggressively, 294 descriptorMap)))), 295 296 new AllMemberVisitor( 299 new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE, 300 new MemberNameConflictFixer(configuration.overloadAggressively, 301 descriptorMap, 302 warningPrinter, 303 new MemberObfuscator(configuration.overloadAggressively, 304 specialNameFactory, 305 specialDescriptorMap)))), 306 307 new MapCleaner(descriptorMap) 309 })); 310 311 programClassPool.classesAccept( 314 new MultiClassVisitor(new ClassVisitor[] 315 { 316 new AllMemberVisitor( 318 new MemberNameCollector(configuration.overloadAggressively, 319 descriptorMap)), 320 321 new ClassHierarchyTraveler(false, true, true, false, 323 new AllMemberVisitor( 324 new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE, 325 new MemberNameCollector(configuration.overloadAggressively, 326 descriptorMap)))), 327 328 new AllMemberVisitor( 331 new MemberAccessFilter(ClassConstants.INTERNAL_ACC_PRIVATE, 0, 332 new MemberNameConflictFixer(configuration.overloadAggressively, 333 descriptorMap, 334 warningPrinter, 335 new MemberObfuscator(configuration.overloadAggressively, 336 specialNameFactory, 337 specialDescriptorMap)))), 338 339 new MapCleaner(descriptorMap) 341 })); 342 343 if (configuration.warn) 345 { 346 int warningCount = warningPrinter.getWarningCount(); 347 if (warningCount > 0) 348 { 349 System.err.println("Warning: there were " + warningCount + 350 " conflicting class member name mappings."); 351 System.err.println(" Your configuration may be inconsistent."); 352 353 if (!configuration.ignoreWarnings) 354 { 355 System.err.println(" If you are sure the conflicts are harmless,"); 356 System.err.println(" you could try your luck using the '-ignorewarnings' option."); 357 throw new IOException("Please correct the above warnings first."); 358 } 359 } 360 } 361 362 if (configuration.printMapping != null) 364 { 365 PrintStream ps = isFile(configuration.printMapping) ? 366 new PrintStream(new BufferedOutputStream(new FileOutputStream(configuration.printMapping))) : 367 System.out; 368 369 programClassPool.classesAcceptAlphabetically(new MappingPrinter(ps)); 371 372 if (ps != System.out) 373 { 374 ps.close(); 375 } 376 } 377 378 programClassPool.classesAccept(new ClassRenamer()); 380 libraryClassPool.classesAccept(new ClassRenamer()); 381 382 programClassPool.classesAccept(new ClassReferenceFixer(false)); 384 libraryClassPool.classesAccept(new ClassReferenceFixer(false)); 385 programClassPool.classesAccept(new MemberReferenceFixer()); 386 387 if (configuration.repackageClasses != null && 390 configuration.allowAccessModification) 391 { 392 programClassPool.classesAccept( 393 new AllConstantVisitor( 394 new ClassOpener())); 395 } 396 397 if (configuration.newSourceFileAttribute != null) 399 { 400 programClassPool.classesAccept(new SourceFileRenamer(configuration.newSourceFileAttribute)); 401 } 402 403 programClassPool.classesAccept(new NameAndTypeUsageMarker()); 406 programClassPool.classesAccept(new NameAndTypeShrinker()); 407 408 programClassPool.classesAccept(new Utf8UsageMarker()); 411 programClassPool.classesAccept(new Utf8Shrinker()); 412 } 413 414 415 419 private boolean isFile(File file) 420 { 421 return file.getPath().length() > 0; 422 } 423 } 424
| Popular Tags
|