0

i am optimizing a jar with proguard, but it crashes after optimization. here is my proguard task:

    <proguard>
        -injars     ${dist}/${jarname}
        -outjars    ${dist}-proguard/${jarname}

        -target 5

        -libraryjars '${java.home}/lib/rt.jar'

        -dontobfuscate            
        -optimizationpasses 4
        -overloadaggressively
        -repackageclasses ''
        -allowaccessmodification

        -keep public class * {
            public static void main(java.lang.String[]);
        }
    </proguard>

as soon as i put in the -dontoptimize option, it works.

according to the stack of the exception it crashes when accessing a static public member of a class with a nullpointer. here is the code:

public static Texture ring, dust, spikering, thinring, crystal, clouds;

public static void init() {
    Field [] fields = TexturePool.class.getDeclaredFields();

    for (Field field : fields) {
        if(field.getType() == Texture.class) {
            field.set( null, /*imagine new object here*/ );
        }
    }
}

thanks!

clamp
  • 33,000
  • 75
  • 203
  • 299
  • I can't really believe that accessing (retrieving, or do you mean something else) the member will throw a NullPointerException. Do you mean that the member can be accessed, but is itself null, so that a NullPointerException is thrown, when trying to use the member? If so, where is the expected value coming from? – jarnbjo Nov 08 '09 at 19:28
  • thanks, well the member is initialized in a function i call before accessing it. – clamp Nov 08 '09 at 20:17
  • I asked about it, but why don't you care to tell us what _exactly_ goes wrong? What is the cause of the NullPointerException? Some VM-internal error when accessing the member (as your post seem to imply) or simply that the member is null, so that a NullPointerException is thrown, when you try to access the member instance? – jarnbjo Nov 08 '09 at 21:48
  • This is a great example why obfuscators should normally not be used unless you REALLY have a good reason to. You basically need to retest your application as you have no idea what has been done to the poor bytecode that the compiler produced. – Thorbjørn Ravn Andersen Nov 08 '09 at 23:18
  • @jarnbjo: ok i will try to provide a testcase. @thorbjorn: i agree, still i would be very interested as why proguards optimization leads to a crash – clamp Nov 09 '09 at 13:01

3 Answers3

2

ok, i just found out myself. i think the optimization completely optimized that classmembers away, since they are not directly accessed in this class. if i specify the option:

        -keepclassmembers public class com.package.** {
            public static * ;
        }

it works even with optimization.

clamp
  • 33,000
  • 75
  • 203
  • 299
1

According to Best Java Obfuscation Application For Size Reduction:

"I was always able to fix the problem by not using the Proguard argument "-overloadaggressively"."

Perhaps you should try the same?


EDIT: The problem could easily be that an assignment is optimized away. The initializations happening in the source code, where a field is defined, is actually done by the compiler in a static code blokc. Appears that the optimizations tinker with that. What happens with fewer optimization passes?

Community
  • 1
  • 1
Thorbjørn Ravn Andersen
  • 73,784
  • 33
  • 194
  • 347
0

I had the same issue with ProGuard optimizing away class fields that were modified using reflection API only. However, the suggested answer didn't work for me as there were too many classes scattered throughout the code base to specify class filter.

Instead, disabling field optimization did the trick for me:

-optimizations !field/*
akrylov
  • 1
  • 1