2011-06-09 3 views
0

J'utilise Eclipse et le construit de ProGuard inclus avec la dernière version d'Android, en essayant d'obscurcir mon application Android, mais il continue à supprimer des méthodes importantes. Je l'ai essayé de modifier le fichier proguard.cfg pour garder les méthodes en tapant diverses exclusions, telles que les suivantesContrôle Proguard minceur des méthodes dans Android

  • garder myMethod public void (String myString)

  • garder public class MyInterface

  • garder com.help.app.myInterface public class. **

mais aucun d'entre eux travaillent. Quand je regarde dans le fichier usage.txt les méthodes sont toujours là et mon application ne fonctionne pas. Je ne comprends pas ce que je fais mal. J'apprécierais de l'aide.

Voici ce qui ressemble ma classe comme

package com.whoiam.whatido; 

public class MainClass extends Activity { 
    ...... 
    public void onCreate(Bundle savedInstanceState) { 
     .... 

    } 

    .... 
    .... 

    final class myInterface { 

     myInterface() {}  

     public void dontDeleteMePlease(String message) { 
      .... 

     } 
     public void leaveMeBe(String message) { 
      ... 

     } 


     ..... 

    } 
    final class MyWebChromeClient extends WebChromeClient { 
     @Override 
     public boolean onJsAlert(WebView view) { 
      .... 
     } 
} 

Voici un exemple de mon fichier proguard.cfg (il est par défaut, sauf pour les trois « garder » près du milieu):

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-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.android.vending.licensing.ILicensingService 

-keep public class com.whoiam.whatido.myInterface.** 

-keep public class com.whoiam.whatido.myInterface.** { 
    <methods>;} 

-keep public void leaveMeBe(String message); 

-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 *; } 

J'ai aussi essayé de ne pas réfléchir car je ne veux pas vraiment que mon code soit coupé ... mais hélas ça rétrécit quand même. J'ai aussi essayé autant de variations que je peux penser pendant des heures, mais rien ne sauve mes méthodes. Comment sauvegarder mon "donDontDeleteMePlease" de la colère de ProGuard?

Qu'est-ce que j'ai besoin de taper dans ce fichier proguard.cfg pour le faire comme moi?

Répondre

1

Cela devrait fonctionner:

-keep class com.whoiam.whatido.MainClass$myInterface { 
    public void dontDeleteMePlease(java.lang.String); 
    public void leaveMeBe(java.lang.String); 
} 

Notez que la classe interne est spécifiée avec une $ et qu'il ne soit pas public.

Vous trouverez plus d'informations et d'exemples dans le ProGuard manual.

+0

Pendant un moment, j'ai pensé que cela fonctionnait. Mais il ne conserve toujours pas les fonctions. Je voudrais arrêter de mincir tous ensemble, mais cela ne semble pas fonctionner. J'ai lu leur manuel et je suis bref. Il me semble que c'est couper le com.android.vending.licensing.ILicensingService que google lui dit de garder. Très têtu, il devrait être si dur :) Merci pour l'aide et si vous avez des idées supplémentaires s'il vous plaît faites le moi savoir. – Patrick