2015-11-27 7 views
5

Ich baue ein Android-Framework und ich muss das Glas verschleiern und verkleinern, um es an die Benutzer zu versenden.Wie verschleiert man alles außer öffentlichen Methodennamen und -attributen mit Proguard?

Ich bin mit dem proguard Tool im Android SDK enthält, und ich habe die folgenden Anforderungen für die Ausgabe jar:

  • halten alle Klassen in dem Eingang Glas eingeschlossen, aber sie verschleiern.
  • Sie die Klassennamen der Klassen in der `AndroidManifest.xml genannt nicht verschleiern
  • Sie den Klassennamen und den öffentlichen Methodennamen nicht verschleiern/Attribute für die Klasse, die eine Schnittstelle für den Benutzer verwendet wird, jedoch hat Mach es für ihren Inhalt.

Dazu verwende ich die folgende Konfiguration:

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

jedoch Namen meiner privaten Klassen und Attribute haben immer noch den gleichen Namen, obwohl der Inhalt verschleiert wird. Habe ich etwas in meinen Wildcards vermisst?

+0

Sie die '-keepnames' Option nutzen zu können muss wirklich? Ich denke, es ist derjenige, der deine Verschleierung inkorrekt macht. –

Antwort

7

Nach einem wenig zu spielen, fand ich die folgenden

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

Der Fehler in Ihrer Konfiguration zu arbeiten, das Vorhandensein von { *; } am Ende der -keepnames Option.

habe ich die folgende Klasse:

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

und die dekompilierten resultierende Klasse wurde dies:

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

Vielen Dank, dass es behoben wurde. –

Verwandte Themen