2012-05-11 24 views
8

Quiero usar Proguard para ofuscar el código de una aplicación. No necesito optimizaciones, y no necesito que Proguard retire todas las clases o métodos. Todo lo que quiero es ofuscación. La aplicación utiliza varios proyectos de biblioteca.Android y Proguard: ¿cómo ofuscar, pero no optimizar ningún código?

He estado golpeando mi cabeza contra la pared tratando de hacerlo realidad y no está funcionando como yo quiero. Estoy viendo que NoSuchMethodExceptions se lanzó en la aplicación cuando se ejecutó, aunque pensé que había desactivado las opciones de reducción de Proguard.

¿Cuáles son las configuraciones mágicas para que Proguard JUST se ofusque y no optimice CUALQUIER código?

ACTUALIZACIÓN. He confirmado a través de prueba y error que es el proceso de ofuscación (no la optimización o la reducción) lo que está causando las NoSuchMethodExceptions.

Proguard.cfg

-dontpreverify 
-repackageclasses '' 
-allowaccessmodification 
-optimizations !code/simplification/arithmetic 
-keepattributes *Annotation* 
-dontshrink 
-keep public class * extends Object 
-keep class com.myapp.** { *; } 
-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class com.myapp.activity.Splash 
-keep public class com.myapp.alarm.AlarmsViewer 
-keep public class com.myapp.activity.About 
-keep public class com.myapp.activity.Base 
-keep public class com.myapp.activity.BaseWithMenu 
-keep public class com.myapp.alarm.Alarm 
-keep public class com.myapp.alarm.AlarmFragment 
-keep public class com.myapp.alarm.AlarmPagerAdapter 
-keep public class com.myapp.alarm.AlarmStore 
-keep public class com.myapp.app.App 
-keep public class com.myapp.preferences.Preferences 
-keep public class com.myapp.preferences.PreferencesStore 

-keep public class * extends android.view.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*(...); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * implements android.os.Parcelable { 
    static android.os.Parcelable$Creator CREATOR; 
} 

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

-keep class android.support.v4.app.** { *; } 
-keep interface android.support.v4.app.** { *; } 
-keep class com.actionbarsherlock.** { *; } 
-keep interface com.actionbarsherlock.** { *; } 

-keepattributes *Annotation* 

-keep public interface com.android.vending.licensing.ILicensingService 

-dontwarn android.support.** 
+0

Si usted no sabe cómo ofuscar sin optimización, ¿cómo se puede saber que el paso de optimización es el problema? – for3st

Respuesta

6

que tenía problemas similares hace un tiempo y lo resolvió para mí por la fuerza bruta y la suerte. Mi proguard.cfg es similar pero no tengo las líneas:

-dontshrink 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

No puedo recordar de dónde saqué la idea para estas opciones de optimización, pero parece que funciona para mí.

siempre existe la captura todos los conmutadores

-dontoptimize 

(Especifica que no para optimizar los archivos de clases de entrada Por defecto, la optimización está activada;.. Todos los métodos están optimizados a nivel de código de bytes)

cuales podría ser más apropiado.

fin he métodos que sólo se hace referencia en archivos XML (clic manipuladores) que debían ser mantenido de forma explícita con

-keepclassmembers class * extends android.app.Activity { 
    public void myClickHandler(android.view.View); 
} 
+4

No tengo ningún manejador de clics XML, e incluso con -dontoptimize y -dontshrink especificado, sigue explotando con NoSuchMethodException. Desconcertante. ¡Qué montón de basura progenie Proguard es. –

+0

Disculpa que no funciona para ti. Debo estar de acuerdo con usted: el manual es muy difícil de seguir. Realmente debería haber un conmutador -justobfuscate. Desafortunadamente necesitamos la ofuscación ya que los apk son tan fáciles de desarmar. – NickT

+1

Wow. Manual de ProGuard> Introducción> Puntos de entrada ... Manual de ProGuard> Solución de problemas> Problemas en el tiempo de ejecución> NoSuchMethodException. –