Proguard,保留所有引用的类

时间:2017-09-18 13:46:39

标签: java proguard android-proguard

假设我有结构:

import some.other.Clazz;

public class A {

    Clazz clazz;
    B b;

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

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

是否有一些漂亮的proguard技巧可以让我递归 keep我班A使用的所有课程?那么BCClazz内部引用的所有类都是?

1 个答案:

答案 0 :(得分:2)

我不认为你只能用proguard这样做,我真的怀疑有一个简单的解决方案(你可以使用的插件)和mvn \ gradle \ sbt \无论如何。

如果您在构建期间运行代码或shell命令没问题,我可以向您推荐一些构建块,但是,因为将它们放在一起真的取决于您如何构建项目我只能提供有关如何将它们粘合在一起的基本建议

一般的想法是:

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

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

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

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

(3)在(2)中生成的主proguard配置文件include配置文件中。

步骤(2)需要大量的工作,并且可以采用不同的方法。

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

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

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

  1. 将管道jdeps输出为:

    grep -Po classname_regex

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

  2. grep的输出管道输出为:

    awk '{print "-keep class " $0}

    ...获取proguard配置并将输出保存到文件。