2016-07-14 1 views
2

Я создал класс Java с внутренним интерфейсом, как это:не удается получить доступ к внутреннему интерфейсу из ProGuard-эд JAR

public class TaskManager { 
    ..other codes.. 

    public interface TaskManagerListener { 
     void onLoad(); 
    } 

    ..other codes.. 
} 

Тогда я завернул его в баночку с использованием ProGuard для запутывания/усадка.
я использовал следующую конфигурацию: ProGuard

-keepattributes InnerClasses 
-keep public class package.name.of.TaskManager { *; } 
-keep public interface package.name.of.TaskManager$TaskManagerListener { *; } 

Я проверил из JAR, что класс и внутренний интерфейс являются там: this image.

Моя проблема теперь в том, когда я пытаюсь получить доступ к этому внутреннему интерфейсу из кода, который использует JAR. Я могу получить доступ к классу TaskManager, но доступ к TaskManager.TaskManagerListener вызывает ошибку компиляции.

Эти работы:

  1. public class MyTaskManager extends TaskManager {..}
  2. TaskManager tm = new TaskManager();

Но они не:

  1. public class MyTaskManagerListener implements TaskManager.TaskManagerListener

  2. new TaskManager.TaskManagerListener() { @Override public void onLoad() {..} });

"Не удается разрешить символ TaskManagerListener" поднимается ошибка.

Я попытался получить доступ к TaskManager.TaskManagerListener от исходного кода библиотеки JAR, и он работает нормально. Так что, я думаю, я не могу получить доступ к нему, когда он находится внутри JAR ..?

Есть ли способ сделать эту работу?
Или мое ожидание не так?
Я не уверен, есть ли что-то в моей конфигурации ProGuard или с моим пониманием Java и внутренних интерфейсов.

Я уже проверил this ответ, и я уже рассматриваю обходной путь, чтобы не использовать вложенный интерфейс.

ответ

0

Я совершил тупая ошибка.
Конфигурация ProGuard, которую я использовал, была фактически правильной, но другая опция keepattributes !InnerClasses отрицала конфигурацию, которую я использовал (, по-видимому, порядок keepattributes вариантов на самом деле не имеет значения).

Это по-прежнему верно:

-keepattributes InnerClasses 
-keep public class package.name.of.TaskManager { *; } 
-keep public interface package.name.of.TaskManager$TaskManagerListener { *; } 

Который будет производить обфусцированный БАНКУ ниже:

enter image description here

который теперь делает эти работы:

1. public class MyTaskManager extends TaskManager {..} 
2. TaskManager tm = new TaskManager(); 
Смежные вопросы