1 21 package proguard.obfuscate; 22 23 import proguard.classfile.*; 24 import proguard.classfile.util.*; 25 import proguard.classfile.visitor.MemberVisitor; 26 27 import java.util.*; 28 29 40 public class MemberObfuscator 41 extends SimplifiedVisitor 42 implements MemberVisitor 43 { 44 private boolean allowAggressiveOverloading; 45 private NameFactory nameFactory; 46 private Map descriptorMap; 47 48 49 58 public MemberObfuscator(boolean allowAggressiveOverloading, 59 NameFactory nameFactory, 60 Map descriptorMap) 61 { 62 this.allowAggressiveOverloading = allowAggressiveOverloading; 63 this.nameFactory = nameFactory; 64 this.descriptorMap = descriptorMap; 65 } 66 67 68 70 public void visitAnyMember(Clazz clazz, Member member) 71 { 72 String name = member.getName(clazz); 75 if (name.equals(ClassConstants.INTERNAL_METHOD_NAME_CLINIT) || 76 name.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT)) 77 { 78 return; 79 } 80 81 String descriptor = member.getDescriptor(clazz); 83 84 if (!allowAggressiveOverloading) 86 { 87 descriptor = descriptor.substring(0, descriptor.indexOf(')')+1); 90 } 91 92 Map nameMap = retrieveNameMap(descriptorMap, descriptor); 94 95 String newName = newMemberName(member); 97 98 if (newName == null) 100 { 101 nameFactory.reset(); 103 104 do 105 { 106 newName = nameFactory.nextName(); 107 } 108 while (nameMap.containsKey(newName)); 109 110 nameMap.put(newName, name); 112 113 setNewMemberName(member, newName); 115 } 116 } 117 118 119 121 128 static Map retrieveNameMap(Map descriptorMap, String descriptor) 129 { 130 Map nameMap = (Map)descriptorMap.get(descriptor); 132 133 if (nameMap == null) 135 { 136 nameMap = new HashMap(); 137 descriptorMap.put(descriptor, nameMap); 138 } 139 140 return nameMap; 141 } 142 143 144 149 static void setFixedNewMemberName(Member member, String name) 150 { 151 VisitorAccepter lastVisitorAccepter = MethodLinker.lastVisitorAccepter(member); 152 153 if (!(lastVisitorAccepter instanceof LibraryMember) && 154 !(lastVisitorAccepter instanceof MyFixedName)) 155 { 156 lastVisitorAccepter.setVisitorInfo(new MyFixedName(name)); 157 } 158 else 159 { 160 lastVisitorAccepter.setVisitorInfo(name); 161 } 162 } 163 164 165 170 static void setNewMemberName(Member member, String name) 171 { 172 MethodLinker.lastVisitorAccepter(member).setVisitorInfo(name); 173 } 174 175 176 181 static boolean hasFixedNewMemberName(Member member) 182 { 183 VisitorAccepter lastVisitorAccepter = MethodLinker.lastVisitorAccepter(member); 184 185 return lastVisitorAccepter instanceof LibraryMember || 186 lastVisitorAccepter instanceof MyFixedName; 187 } 188 189 190 196 static String newMemberName(Member member) 197 { 198 return (String )MethodLinker.lastVisitorAccepter(member).getVisitorInfo(); 199 } 200 201 202 206 private static class MyFixedName implements VisitorAccepter 207 { 208 private String newName; 209 210 211 public MyFixedName(String newName) 212 { 213 this.newName = newName; 214 } 215 216 217 219 public Object getVisitorInfo() 220 { 221 return newName; 222 } 223 224 225 public void setVisitorInfo(Object visitorInfo) 226 { 227 newName = (String )visitorInfo; 228 } 229 } 230 } 231 | Popular Tags |