2015-11-27 2 views
5

Я строю рамки андроида, и мне нужно запутывать и сжимать банку, чтобы отправить ее пользователям.Как обфускать все, кроме общедоступных имен методов и атрибутов с помощью proguard?

Я использую инструмент Proguard включенный в Android SDK и у меня есть следующие требования к выходной баночке:

  • держать все классы включены во входной баночке, но запутать их.
  • не запутывают имена классов классов, вызываемые в AndroidManifest.xml
  • не обфускают имя класса и общедоступные имена/атрибуты метода для используемого класса, однако для пользователя есть интерфейс сделайте это для их содержимого.

Для этого я использую следующую конфигурацию:

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

Однако мои имена частных классов и атрибутов по-прежнему имею такое же имя, даже если содержание обфусцированные. Я что-то пропустил в своих подстановочных знаках?

+0

Вы действительно должны использовать '-keepnames' вариант? Я думаю, что это тот, который делает вашу обфускацию неправильной. –

ответ

7

Поиграв немного, я нашел следующее, чтобы работать

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

ошибка в конфигурации является наличие { *; } в конце опции -keepnames.

Я использовал следующий класс:

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

и декомпилированный полученный класс это:

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

Спасибо, что исправил это. –

Смежные вопросы