2012-05-11 11 views
8

Voglio usare Proguard per offuscare il codice di un'app. Non ho bisogno di ottimizzazioni e non ho bisogno di Proguard per rimuovere qualsiasi classe o metodo. Tutto quello che voglio è l'offuscamento. L'app utilizza diversi progetti di libreria.Android & Proguard - come nascondere, ma non ottimizzare alcun codice?

Ho sbattuto la testa contro il muro cercando di farlo accadere e non funziona come voglio io. Quando eseguo, vedo NoSuchMethodExceptions lanciate nell'app, anche se pensavo di aver disattivato le opzioni di riduzione di Proguard.

Quali sono le impostazioni magiche per cui Proguard JUST può offuscare e non ottimizzare via NESSUN codice?

AGGIORNAMENTO. Ho confermato per tentativi ed errori che è il processo di offuscamento (non l'ottimizzazione o il restringimento) che sta causando 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

Se non sai come offuscare senza ottimizzazione, come si può sapere che il la fase di ottimizzazione è il problema? – for3st

risposta

6

ho avuto problemi simili un po 'indietro e risolto per me con la forza bruta e fortuna. Il mio proguard.cfg è simile ma non ho le linee:

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

non ricordo da dove mi è venuta l'idea per queste opzioni di ottimizzazione, ma sembrano funzionare per me.

c'è sempre il fermo tutto interruttore

-dontoptimize 

(Specifica di non ottimizzare i file di classe di ingresso Per impostazione predefinita, l'ottimizzazione è abilitato;.. Tutti i metodi sono ottimizzati a livello di bytecode)

che potrebbe essere più appropriato.

Finalmente ho metodi che si fa riferimento solo in file XML (clicca gestori) che dovevano essere esplicitamente tenuto con

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

Non ho alcun gestore di clic XML e, anche con -dontoptimize e -dontshrink specificato, esso continua a esplodere con NoSuchMethodException. Sconcertante. Che pila di Proguard spazzatura over-engineered è. –

+0

Mi spiace che non funzioni per te. Devo essere d'accordo con te: il manuale è molto difficile da seguire. Dovrebbe davvero esserci un interruttore -justobfuscate. Sfortunatamente abbiamo bisogno dell'offuscamento visto che gli apk sono così facili da smontare. – NickT

+1

Wow. Manuale di ProGuard> Introduzione> Punti di inserimento ... Manuale di ProGuard> Risoluzione dei problemi> Problemi in fase di esecuzione> NoSuchMethodException. –

Problemi correlati