2011-09-18 5 views
40

La mia applicazione ha molte attività e utilizza anche la libreria nativa. Con la configurazione predefinita di ProGuard che Eclipse genera ProGuard rimuove molte cose: metodi OnClick, membri statici, metodi di callback che la mia libreria nativa usa ... C'è un modo semplice per istruire ProGuard a NON rimuovere nulla dal mio pacchetto? La rimozione di oggetti consente di risparmiare solo il 2,5% circa delle dimensioni dell'applicazione, ma interrompe completamente la mia applicazione. Configurare, testare e mantenerlo classe per classe nella configurazione di ProGuard sarebbe un problema.Come dire a ProGuard di conservare tutto in un determinato pacchetto?

+2

vuol dire, ad esempio, come semplicemente non utilizzando Proguard? – mah

+5

No, voglio l'offuscamento, non voglio semplicemente rimuovere alcuna classe e membro della classe dal mio pacchetto. – ggurov

+0

Ho avuto lo stesso problema. Questo dovrebbe aiutarti. http://stackoverflow.com/questions/6633411/android-proguard-only-obfuscation – Vinoth

risposta

17

Come risultato finale ho trovato che solo mantenendo tutti i membri della classe non è sufficiente per la corretto lavoro della mia applicazione, né necessario. Ho addded per il file di impostazioni questo:

-keepclasseswithmembers class * { 
    void onClick*(...); 
} 
-keepclasseswithmembers class * { 
    *** *Callback(...); 
} 

il caso con onClick * è per tutti i metodi che rivolgo in Android: onClick atribute nei file di layout XML (comincio i nomi di tutti questi metodi con 'onclick').

Il caso con * Callback è per tutti i metodi di callback che chiamo dal mio codice nativo (tramite JNI). Metto un suffisso 'Callback' al nome di ogni metodo.

Inoltre ho aggiunto alcune righe per alcuni casi particolari con le variabili che uso da codice nativo, come:

-keep class com.myapp.mypackage.SomeMyClass { 
    *** position; 
} 

(per un varible con il nome di 'posizione' in una classe con il nome 'SomeMyClass' dal pacchetto com.myapp.mypackage)

Tutto ciò è dovuto al fatto che questi onClick, callback, ecc. non devono essere solo presenti ma anche mantenuti con i loro nomi originali. Le altre cose che ProGuard può ottimizzare liberamente.

il caso con i metodi nativi è importante anche, ma perché c'era una dichiarazione nella generato da Eclipse di file:

-keepclasseswithmembernames class * { 
    native <methods>; 
} 
44

penso che è necessario aggiungere queste bandiere per lo meno (modificare per voi nomi dei pacchetti individuali):

-keep class javax.** { *; } 
-keep class org.** { *; } 
-keep class twitter4j.** { *; } 

Inoltre, aggiungere queste bandiere:

-dontshrink 
-dontoptimize 
-dontpreverify 

Ecco tutto il mio file di configurazione : della mia Proguard.cfg:

-dontshrink 
-dontoptimize 
-dontpreverify 
-verbose 

-dontwarn javax.management.** 
-dontwarn java.lang.management.** 
-dontwarn org.apache.log4j.** 
-dontwarn org.apache.commons.logging.** 
-dontwarn org.slf4j.** 
-dontwarn org.json.** 


-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 * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 
-keep class javax.** { *; } 
-keep class org.** { *; } 
-keep class twitter4j.** { *; } 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

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

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

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 


-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 
+1

Grazie, ho usato "-dontshrink" dalle opzioni citate. – ggurov

+1

La mia soluzione finale non utilizza nulla dalla tua risposta (controlla la mia ultima modifica), perché la mia comprensione si è evoluta, ma in ogni caso hai meritato il mio upvote e tu ce l'hai - perché la risposta è buona per la domanda iniziale. – ggurov

+0

Abbastanza giusto. Grazie comunque. –

Problemi correlati