2015-11-27 9 views
5

Buduję platformę dla Androida i muszę zaciemnić i skurczyć słoik, aby wysłać ją do użytkowników.Jak zaciemnić wszystko oprócz publicznych nazw metod i atrybutów za pomocą proguard?

Używam narzędzie PROGUARD zawarte w Android SDK i mam następujące wymagania dla słoika wyjściowa:

  • zachować wszystkie zajęcia ujęte w słoiku wejściowego, ale zaciemniać im.
  • nie zamazywać nazw klas wywołanych w "AndroidManifest.xml"
  • nie zaciemniać nazwy klasy i publicznych nazw/atrybutów dla klasy, która jest używana, ma interfejs użytkownika, jednak rób to dla ich zawartości.

Aby to zrobić, używam następującej konfiguracji:

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

jednak moja nazwy atrybutów klas prywatnych i nadal mają taką samą nazwę, mimo że zawartość jest zaciemniony. Czy tęskniłem za czymś w moich identyfikatorach?

+0

Czy naprawdę trzeba użyć opcji '-keepnames'? Myślę, że to właśnie sprawia, że ​​twoje zaciemnianie jest nieprawidłowe. –

Odpowiedz

7

Po odtworzeniu trochę, znalazłem następujące pracować

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

Błąd w konfiguracji jest obecność { *; } na koniec opcji -keepnames.

użyłem następujące klasy:

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

i dekompilowana wynikające klasa była to:

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

Dziękuję, że to naprawiłem. –

Powiązane problemy