Как не обфускать методы интерфейса и его параметры с помощью Progaurd в android?
У меня есть следующий код
public class MyClass {
public void method1(Integer marks) {
}
private String method3(String name){
}
public interface interface1 {
void method4(Integer ID);
void method5(Integer rate, boolean status);
}
}
Я использовал progaurd-rules.pro
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keepparameternames
-keep public class *
-keepclassmembers public class *{
public *;
}
-keep public interface packageName.MyClass$interface1 { *; }
Обфускационный код, как показано ниже:
public class MyClass {
public void method1(Integer marks) {
}
private String a(String var1){
}
public interface interface1 {
void method4(Integer var1);
void method5(Integer var1, boolean var2);
}
}
Я хочу, чтобы переменные методов интерфейса (ID, скорость и статус) не путались. т.е. ниже
public interface interface1 {
void method4(Integer ID);
void method5(Integer rate, boolean status);
}
Кто-нибудь может предложить, как это возможно?
Ответы
Ответ 1
Вы можете сохранить аргументы метода, добавив дополнительные флаги в -keepattributes
. Они выглядят так:
-keepattributes LocalVariableTable,LocalVariableTypeTable
К сожалению, это держит аргументы от обфускации не только в желаемом интерфейсе, но и во всем проекте. Возможно, это хорошо для вас.
Если вы используете стандартную конфигурацию proguard, поставляемую вместе с Android SDK, тогда вы также можете использовать специальную аннотацию, чтобы предотвратить запутывание некоторых классов. Проверьте это.
Ответ 2
Правила защиты >
Для интерфейсов
Чтобы классы интерфейса продолжали использовать
-keep public interface
Пример: -keep public interface packageName.yourclass$interface1 { *; }
для сохранения элементов интерфейса
-keep interface * {
<methods>;
}
В соответствии с ProGuard документация, подстановочный знак соответствует любому полю.
Ключевое слово класса относится к любому интерфейсу или классу. Интерфейс keyword ограничивает соответствие классам интерфейсов. Ключевое слово enum ограничивает соответствие классам перечисления. Предшествующий интерфейс или перечислить ключевые слова a! ограничивает совпадения с классами, которые не являются интерфейсов или перечислений, соответственно.
-keep public interface com.somepackage.SomeClass$someInterface {
private <fields>;
}
Я тоже не уверен, что это тоже.
-keepclasseswithmembers class com.somepackage.SomeClass$someInterface{
void method4*(...);
void method5*(...);
}
Ответ 3
ProGuard использует соглашение об именах байт-кода Java, как это видно в именах файлов классов и stacktraces. Поэтому:
-keep public interface com.somepackage.SomeClass$someInterface {*;}
Если ваш интерфейс не является общедоступным.
-keep interface com.somepackage.SomeClass$someInterface {*;}.