[insert lengthy and passionate "+1/me too" implementation] Also: > there are much more complicated optimizations to the byte code that Dalvik doesn't handle well.
I'd like to know more about that as well! On Dec 7, 6:34 pm, Matt Quigley <[email protected]> wrote: > In the latest Android SDK Tools (revision 8), ProGuard has been > integrated into the ant build. This is easier to set up than it was > before (http://www.androidengineer.com/2010/07/optimizing-obfuscating- > and-shrinking.html), but I'm curious about the optimizations that are > disabled by default. > > From the proguard.cfg file created with "android update project -p .": > -optimizations !code/simplification/arithmetic,!field/*,!class/merging/ > * > > #1: code/simplification/arithmetic: This removes things like turning > "3 + 3" into "6". A shame, but understandable, because there are much > more complicated optimizations to the byte code that Dalvik doesn't > handle well. This one is completely understood. > > #2: !field/*: This refers to the following: > field/removal/writeonly - Removes write-only fields. > field/marking/private - Marks fields as private, whenever possible. > field/propagation/value - Propagates the values of fields across > methods. > > #3: !class/merging/*: This disables merging two or more classes > horizontally or vertically (in the same class hierarchy). > > The question here is, why would #2 and #3 give Android or Dalvik any > problems? The classes are valid Java classes in the end. I suspect > the answer for #2 is that projects built into Android require that the > R.* classes to remain intact. However, this is NOT the case for > private apps created by developers, unless they use introspection to > access those fields. There is no need for the R class at all; all of > the constants of that class can be propagated into whomever uses them, > and the the R class can be removed. For #3, this might have something > to do with the fact that Views referenced in layout .xml files are > dynamically created at runtime by reflection, and maybe merging these > classes together messes them up. But isn't that prevented by -keep > public class * extends **View? > > For over a year I've been obfuscating my app and #2 and #3 have never > been used. I don't plan on using them from now on, either. Unless, > someone can clarify why I shouldn't be enabling #2 and #3? > > Thanks! > -Matt > > P.S. I would recommend adding the following to the next version of the > Android SDK Tool's automatically generated proguard.cfg file: > # Keep classes which are not directly referenced by code, but > referenced by layout files. > -keep public class * extends **View { > public <init>(android.content.Context); > public <init>(android.content.Context, android.util.AttributeSet); > public <init>(android.content.Context, android.util.AttributeSet, > int); > public void set*(...);} > > This prevents classes which extend View, TextView, etc. classes from > being renamed. This will avoid ClassNotFoundExceptions when > developers use custom View classes referenced in their layout files. > It will hit some false positives (i.e. a class which ends with View > may not actually be used as such), but that is acceptable IMHO, and > can be easily changed by a developer as needed. > > An alternative is to use -keep public class * extends > android.view.View, which removes all false positives, but will add > some missed cases, such as a class which extends TextView. -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

