Proguard,保留所有引用 类

Proguard, keep all referenced classes

假设我有结构:

import some.other.Clazz;

public class A {

    Clazz clazz;
    B b;

    public class B {
        C c;
        //...
    }

    public static class C {
        //...
    }
}

是否有一些漂亮的 proguard 技巧可以让我递归地 keep 我的 class 使用的所有 classes A? BCClazz?

内部引用的所有 classes

我不认为你可以只用混淆器来做到这一点,我真的怀疑是否有一个直接的解决方案(你可以使用插件)mvn\gradle\sbt\whatever。

如果您在构建过程中可以使用 运行ning 代码或 shell 命令,我可以向您推荐一些构建块,但是,由于将它们组合在一起实际上取决于您构建项目的方式,我只能给出关于如何将它们粘合在一起的基本建议。


大意是:

(1) 使用 jdeps(jdk 的一部分并与 jdk 一起分发)从已编译的 .class 中获取依赖项(包括传递性)感兴趣的文件。

在你的情况下,输出 some.class 的递归依赖(限于 root_package)应该是这样的:

jdeps -v -R -e "root_package.*" some.class

(2) 抓取 jdeps 输出并将其转换为 proguard 配置(classes 到 -keep 的列表)。

(3) 在您的主混淆器配置文件中 include 您在 (2) 中生成的配置文件。


步骤 (2) 需要最多的跑腿工作,可以采用不同的方法。

我的建议是使用构建系统所具有的任何脚本功能 运行 jdeps 并进行输出转换。

例如,Maven 在构建期间有 plugin that allows groovy scripts to be executed

如果您更熟悉 运行ning shell 脚本,您可以执行以下操作:

  1. pipe jdeps 输出为:

    grep -Po classname_regex

    ... 只保留 class 你想保留的名称(你可以使用零长度断言来构建 classname_regex)。

  2. grep 的输出管道输出为类似以下内容:

    awk '{print "-keep class " [=21=]}

    ...获取混淆器配置并将输出保存到文件。