【问题标题】:Proguard keep all inner classes that implement some interfaceProguard 保留所有实现某些接口的内部类
【发布时间】:2014-03-05 14:26:44
【问题描述】:

以下定义有什么问题?

-keep class com.foo.bar.** 实现 android.content.ServiceConnection { *; }

我需要将 onServiceConnected 或 disconnected 方法保留在:

com.foo.bar.SomeClass$SomeInnerClass$SomeInnerInnerClass 实现 ServiceConnection { // 我需要保留的方法 }

Proguard 总是把它们去掉。

到目前为止,我发现的唯一解决方案是保留整个 com.foo.bar 包。

注意:我不能保留 com.foo.bar.SomeClass 因为名称可以更改。我得到了一个 JAR 文件,其中包含已经受到保护的代码。所以 SomeClass 实际上称为“dw”,而 SomeInnerClass 实际上称为“a”。但我显然不能依赖它。

谢谢。

【问题讨论】:

    标签: java android proguard


    【解决方案1】:

    您的配置看起来是正确的,但 ProGuard 已经自动保留了在运行时接口(如 ServiceConnection)中实现方法的方法。您不需要明确指定它们。您可以查看 bin/proguard/mapping.txt 以查看类和方法的旧/新名称。您可以使用 Android 工具 dexdump 检查 classes.dex 文件,仔细检查类是否存在、它们实现了接口以及方法是否存在。

    【讨论】:

      【解决方案2】:

      对我来说有一个特殊的情况。我保护一个 jar 文件,只保留一个自定义的非系统接口实现,并混淆包括方法内容在内的其他文件。我尝试了很多,并找到了或多或少让我满意的方法。

      -keepclassmembernames class aa.bb.Impl {
          public <methods>;
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多