Подтвердить что ты не робот

Proguard удаляет анонимный класс в анонимном классе в Java

У меня проблема с тем, что Proguard не работает, когда вы объявляете анонимный класс в анонимном классе. Вот как это выглядит в основном примере:

public class Class1 {
  public void function1 (){
     new Class2(){
        @Override
        public void function2(){
          new Class3(){
            @Override
            public void function3(){
              // do something
            }
          }
        }
     }
  }
}

Во время выполнения gradle build script выполняется proguard. Теперь я получаю следующую ошибку:

 my.package.Class1$2$1: can't find enclosing method 'void function2()' in program class my.package.Class1$2

Если я изменю код, чтобы иметь только 1 "уровень" анонимных классов, proguard заканчивается без ошибок. Это работает:

public class Class1 {
  public void function1 (){
      Class3 class3Instance = new Class3(){
            @Override
            public void function3(){
              // do something
            }
      }
      new Class2(){
        @Override
        public void function2(){
           //do something with class3Instance  
        }
     }
  }
}

Проект - проект Android, хотя, насколько я знаю, это не имеет значения.

Я пробовал разные правила -keep для Class1, но ничего не получилось. Это не поддерживается Proguard или мне нужно добавить правило, чтобы заставить его работать?

ОБНОВЛЕНИЕ 1:

Как запрошена структура, если интерфейс используется для анонимных классов. Интерфейс для Class2 определяется следующим образом:

public class Class2IntefaceEnclosingClass {
    public interface Class2 {
        void function2();
    }
}

Интерфейс для Class3 несколько отличается:

public interface Class3IntefaceEnclosingInterface {
    interface Class3 {
        void function3();
    }
}

Примечание. Я не могу изменить компоновку интерфейсов, так как они предоставлены андроидом.

4b9b3361

Ответ 1

Вы можете попытаться использовать @Keep аннотацию выше function1(), function2() и function3().

public class Class1 {
  @Keep
  public void function1 (){
     new Class2(){
        @Keep
        @Override
        public void function2(){
          new Class3(){
            @Keep
            @Override
            public void function3(){
              // do something
            }
          }
        }
     }
  }
}