2015-11-27 16 views
5

Sto costruendo un framework per Android e ho bisogno di offuscare e ridurre il barattolo per spedirlo agli utenti.Come nascondere tutto tranne i nomi e gli attributi dei metodi pubblici con proguard?

sto usando lo strumento Proguard incluso nel SDK di Android e non ho i seguenti requisiti per il vaso di uscita:

  • mantenere tutte le classi comprese nel vaso di ingresso, ma li offuscano.
  • non offuscare la nomi di classe delle classi denominate in `AndroidManifest.xml
  • non fanno offuscare il nome della classe e nomi di metodo pubblici/attributi per la classe che viene utilizzato dispone di un'interfaccia per l'utente, tuttavia fallo per i loro contenuti.

Per farlo, utilizzare la seguente configurazione:

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 

-keep, allowobfuscation class com.company.* 
-keepclassmembers, allowobfuscation class * { 
    *; 
} 


-keepnames class com.company.MyClass { *; } 
-keepclassmembernames class com.company.MyClass { 
    public <methods>; 
    public <fields>; 
    #!private *; also tried this but it didn't work 
} 

Tuttavia il mio nomi classi private e gli attributi ancora avere lo stesso nome, anche se il contenuto è offuscato. Ho perso qualcosa nei miei jolly?

+0

Hai davvero utilizzare l'opzione '-keepnames'? Penso che sia quello che rende scorretta la tua offuscazione. –

risposta

7

Dopo aver giocato un po ', ho trovato quanto segue per lavorare

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 

-keep, allowobfuscation class com.company.* 
-keepclassmembers, allowobfuscation class * { 
    *; 
} 

-keepnames class com.company.MyClass 
-keepclassmembernames class com.company.MyClass { 
    public <methods>; 
    public <fields>; 
    #!private *; also tried this but it didn't work 
} 

L'errore nella configurazione è la presenza di { *; } alla fine dell'opzione -keepnames.

Ho usato la seguente classe:

package com.company; 

public class MyClass { 
    public static void main(String[] args) { 
    int longVariableName = publicStaticMethod(); 
    String abcxyz = privateStaticMethod("abc", "xyz"); 
    System.out.println("longVariableName: " + longVariableName); 
    System.out.println("abcxyz: " + abcxyz); 
    } 

    public static int publicStaticMethod() { 
    return 9000; 
    } 

    private static String privateStaticMethod(String first, String second) { 
    return first + second; 
    } 
} 

e la classe risultante decompilato è stato questo:

package com.company; 

import java.io.PrintStream; 

public class MyClass { 
    public static void main(String[] paramArrayOfString) { 
    paramArrayOfString = publicStaticMethod(); 
    String str = a("abc", "xyz"); 
    System.out.println("longVariableName: " + paramArrayOfString); 
    System.out.println("abcxyz: " + str); 
    } 

    public static int publicStaticMethod() { 
    return 9000; 
    } 

    private static String a(String paramString1, String paramString2) { 
    return paramString1 + paramString2; 
    } 
} 
+0

Grazie a voi che l'ha risolto. –

Problemi correlati