@@ -84,18 +84,39 @@ private Map<String, byte[]> obfuscateWithTransformers(Map<String, byte[]> inputC
8484 byte [] classBytes = entry .getValue ();
8585
8686 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 );
8896
8997 ClassReader currentReader = reader ;
9098 ClassWriter currentWriter = writer ;
9199
92100 for (Transformer transformer : transformers ) {
93101 if (transformer .isEnabled (context )) {
94- ClassWriter nextWriter = new ClassWriter (ClassWriter . COMPUTE_MAXS | ClassWriter .COMPUTE_FRAMES );
102+ ClassWriter nextWriter = new ClassWriter (currentReader , ClassWriter .COMPUTE_MAXS );
95103 transformer .transform (currentReader , nextWriter , context );
96104
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+ }
99120 }
100121 }
101122
@@ -113,23 +134,42 @@ private void setupMappingManager(ObfuscationContext context, Map<String, byte[]>
113134 mappingManager .setInheritanceTracker (inheritanceTracker );
114135
115136 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+ }
119146 }
120147
121148 Set <String > classNames = new HashSet <>();
122149 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+ }
125159 }
126160
127161 mappingManager .generateClassMappings (classNames );
128162
129163 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+ }
133173 }
134174
135175 context .setMappingManager (mappingManager );
@@ -180,8 +220,16 @@ private Map<String, byte[]> loadClassesFromJar(File inputJar) throws IOException
180220 .forEach (entry -> {
181221 try (InputStream inputStream = jarFile .getInputStream (entry )) {
182222 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+ }
185233 } catch (IOException e ) {
186234 throw new RuntimeException ("Failed to read class: " + entry .getName (), e );
187235 }
@@ -191,6 +239,20 @@ private Map<String, byte[]> loadClassesFromJar(File inputJar) throws IOException
191239 return classes ;
192240 }
193241
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+
194256 private void writeObfuscatedJar (File inputJar , File outputJar , Map <String , byte []> obfuscatedClasses ) throws IOException
195257 {
196258 try (JarFile jarFile = new JarFile (inputJar );
0 commit comments