无法从 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
会引发编译错误。
这些作品:
public class MyTaskManager extends TaskManager {..}
TaskManager tm = new TaskManager();
但这些不会:
public class MyTaskManagerListener implements TaskManager.TaskManagerListener
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:
现在可以使这些工作:
public class MyTaskManager extends TaskManager {..}
TaskManager tm = new TaskManager();
我创建了一个 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
会引发编译错误。
这些作品:
public class MyTaskManager extends TaskManager {..}
TaskManager tm = new TaskManager();
但这些不会:
public class MyTaskManagerListener implements TaskManager.TaskManagerListener
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:
现在可以使这些工作:
public class MyTaskManager extends TaskManager {..}
TaskManager tm = new TaskManager();