【问题标题】:Cannot access inner interface from a ProGuard-ed JAR无法从 ProGuard-ed JAR 访问内部接口
【发布时间】:2016-11-16 19:38:58
【问题描述】:

我创建了一个具有如下内部接口的 Java 类:

public class TaskManager {
    // other codes

    public interface TaskManagerListener {
        void onLoad();
    }

    // other codes
}

然后我使用 ProGuard 将其包装在一个 JAR 中以进行混淆/收缩。
我使用了以下 ProGuard 配置:

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

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

我现在的问题是当我尝试从使用 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”错误。

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

有没有办法让它工作?
还是我的期望错了?
我不确定我的 ProGuard 配置中是否缺少某些内容,或者我对 Java 和内部接口的理解。

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

【问题讨论】:

    标签: java jar proguard inner-classes


    【解决方案1】:

    我犯了一个愚蠢的错误。
    我使用的 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();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 2012-06-22
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多