@@ -84,18 +84,39 @@ private Map<String, byte[]> obfuscateWithTransformers(Map<String, byte[]> inputC
84
84
byte [] classBytes = entry .getValue ();
85
85
86
86
ClassReader reader = new ClassReader (classBytes );
87
- ClassWriter writer = new ClassWriter (ClassWriter .COMPUTE_MAXS | ClassWriter .COMPUTE_FRAMES );
87
+ String actualClassName = reader .getClassName ();
88
+
89
+ boolean shouldProcess = shouldProcessClass (actualClassName , config );
90
+ if (!shouldProcess ) {
91
+ result .put (className , classBytes );
92
+ continue ;
93
+ }
94
+
95
+ ClassWriter writer = new ClassWriter (reader , ClassWriter .COMPUTE_MAXS );
88
96
89
97
ClassReader currentReader = reader ;
90
98
ClassWriter currentWriter = writer ;
91
99
92
100
for (Transformer transformer : transformers ) {
93
101
if (transformer .isEnabled (context )) {
94
- ClassWriter nextWriter = new ClassWriter (ClassWriter . COMPUTE_MAXS | ClassWriter .COMPUTE_FRAMES );
102
+ ClassWriter nextWriter = new ClassWriter (currentReader , ClassWriter .COMPUTE_MAXS );
95
103
transformer .transform (currentReader , nextWriter , context );
96
104
97
- currentReader = new ClassReader (nextWriter .toByteArray ());
98
- currentWriter = nextWriter ;
105
+ byte [] transformedBytes = nextWriter .toByteArray ();
106
+
107
+ try {
108
+ ClassReader testReader = new ClassReader (transformedBytes );
109
+ String testClassName = testReader .getClassName ();
110
+ if (testClassName == null ) {
111
+ System .err .println ("Transformer " + transformer .getName () + " produced invalid bytecode for class " + className + " - skipping further transformations" );
112
+ break ;
113
+ }
114
+ currentReader = testReader ;
115
+ currentWriter = nextWriter ;
116
+ } catch (Exception e ) {
117
+ System .err .println ("Transformer " + transformer .getName () + " produced malformed bytecode for class " + className + ": " + e .getMessage () + " - skipping further transformations" );
118
+ break ;
119
+ }
99
120
}
100
121
}
101
122
@@ -113,23 +134,42 @@ private void setupMappingManager(ObfuscationContext context, Map<String, byte[]>
113
134
mappingManager .setInheritanceTracker (inheritanceTracker );
114
135
115
136
for (Map .Entry <String , byte []> entry : inputClasses .entrySet ()) {
116
- ClassReader reader = new ClassReader (entry .getValue ());
117
- net .cvs0 .discovery .InheritanceDiscoveryVisitor inheritanceVisitor = new net .cvs0 .discovery .InheritanceDiscoveryVisitor (inheritanceTracker );
118
- reader .accept (inheritanceVisitor , ClassReader .SKIP_CODE );
137
+ try {
138
+ ClassReader reader = new ClassReader (entry .getValue ());
139
+ if (reader .getClassName () != null ) {
140
+ net .cvs0 .discovery .InheritanceDiscoveryVisitor inheritanceVisitor = new net .cvs0 .discovery .InheritanceDiscoveryVisitor (inheritanceTracker );
141
+ reader .accept (inheritanceVisitor , ClassReader .SKIP_CODE );
142
+ }
143
+ } catch (Exception e ) {
144
+ System .err .println ("Skipping class during inheritance discovery: " + entry .getKey () + " - " + e .getMessage ());
145
+ }
119
146
}
120
147
121
148
Set <String > classNames = new HashSet <>();
122
149
for (String className : inputClasses .keySet ()) {
123
- ClassReader reader = new ClassReader (inputClasses .get (className ));
124
- classNames .add (reader .getClassName ());
150
+ try {
151
+ ClassReader reader = new ClassReader (inputClasses .get (className ));
152
+ String readerClassName = reader .getClassName ();
153
+ if (readerClassName != null ) {
154
+ classNames .add (readerClassName );
155
+ }
156
+ } catch (Exception e ) {
157
+ System .err .println ("Skipping class during name collection: " + className + " - " + e .getMessage ());
158
+ }
125
159
}
126
160
127
161
mappingManager .generateClassMappings (classNames );
128
162
129
163
for (Map .Entry <String , byte []> entry : inputClasses .entrySet ()) {
130
- ClassReader reader = new ClassReader (entry .getValue ());
131
- net .cvs0 .discovery .ClassDiscoveryVisitor discoveryVisitor = new net .cvs0 .discovery .ClassDiscoveryVisitor (mappingManager , inheritanceTracker );
132
- reader .accept (discoveryVisitor , ClassReader .SKIP_CODE );
164
+ try {
165
+ ClassReader reader = new ClassReader (entry .getValue ());
166
+ if (reader .getClassName () != null ) {
167
+ net .cvs0 .discovery .ClassDiscoveryVisitor discoveryVisitor = new net .cvs0 .discovery .ClassDiscoveryVisitor (mappingManager , inheritanceTracker );
168
+ reader .accept (discoveryVisitor , ClassReader .SKIP_CODE );
169
+ }
170
+ } catch (Exception e ) {
171
+ System .err .println ("Skipping class during discovery: " + entry .getKey () + " - " + e .getMessage ());
172
+ }
133
173
}
134
174
135
175
context .setMappingManager (mappingManager );
@@ -180,8 +220,16 @@ private Map<String, byte[]> loadClassesFromJar(File inputJar) throws IOException
180
220
.forEach (entry -> {
181
221
try (InputStream inputStream = jarFile .getInputStream (entry )) {
182
222
byte [] classBytes = inputStream .readAllBytes ();
183
- String className = entry .getName ().substring (0 , entry .getName ().length () - 6 );
184
- classes .put (className , classBytes );
223
+
224
+ try {
225
+ ClassReader testReader = new ClassReader (classBytes );
226
+ String className = testReader .getClassName ();
227
+ if (className != null && !className .isEmpty ()) {
228
+ classes .put (className , classBytes );
229
+ }
230
+ } catch (Exception e ) {
231
+ System .err .println ("Skipping invalid class file: " + entry .getName () + " - " + e .getMessage ());
232
+ }
185
233
} catch (IOException e ) {
186
234
throw new RuntimeException ("Failed to read class: " + entry .getName (), e );
187
235
}
@@ -191,6 +239,20 @@ private Map<String, byte[]> loadClassesFromJar(File inputJar) throws IOException
191
239
return classes ;
192
240
}
193
241
242
+ private boolean shouldProcessClass (String className , ObfuscationConfig config )
243
+ {
244
+ if (className == null ) {
245
+ return false ;
246
+ }
247
+
248
+ String packageScope = config .getPackageScope ();
249
+ if (packageScope != null && !packageScope .isEmpty ()) {
250
+ return className .startsWith (packageScope );
251
+ }
252
+
253
+ return true ;
254
+ }
255
+
194
256
private void writeObfuscatedJar (File inputJar , File outputJar , Map <String , byte []> obfuscatedClasses ) throws IOException
195
257
{
196
258
try (JarFile jarFile = new JarFile (inputJar );
0 commit comments