无法从 ProGuard-ed JAR 访问内部接口

Cannot access inner interface from a ProGuard-ed JAR

我创建了一个 Java class,其内部界面如下:

public class TaskManager {
    // other codes

    public interface TaskManagerListener {
        void onLoad();
    }

    // other codes
}

然后我使用 ProGuard 将它包装在一个 JAR 中,用于 obfuscation/shrinking。
我使用了以下 ProGuard 配置:

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

我从 JAR 中验证了 class 和内部接口在那里: .

我现在的问题是当我尝试从使用 JAR 的代码访问该内部接口时。我可以正常访问 TaskManager class 但访问 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() {..} });

出现"Cannot resolve symbol TaskManagerListener"错误。

我尝试从 JAR 库的原始代码访问 TaskManager.TaskManagerListener,它工作正常。所以我想只有当它在 JAR 中时我才能访问它..?

有没有办法让它工作?
还是我的预期有误?
我不确定我的 ProGuard 配置或我对 Java 和内部接口的理解是否缺少某些东西。

我已经检查了 this 答案并且我已经在考虑不使用嵌套界面的解决方法。

我犯了一个愚蠢的错误。
我使用的 ProGuard 配置实际上是正确的,但是另一个 keepattributes !InnerClasses 选项否定了我使用的配置(显然,keepattributes 选项的顺序并不重要).

这仍然是正确的:

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

这将生成以下经过混淆的 JAR:

现在可以使这些工作:

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