Как не обфускать методы интерфейса и его параметры с помощью 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 {*;}.