Proguard,保留所有引用的类

Bar*_*ski 6 java proguard android-proguard

假设我有结构:

import some.other.Clazz;

public class A {

    Clazz clazz;
    B b;

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

    public static class C {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有一些漂亮的proguard技巧,允许我递归 keep所有类我使用的类A?那么内部引用的所有类B,C以及Clazz

Eug*_*Loy 3

我认为你不能只用 proguard 来做到这一点,我真的怀疑是否有一个简单的解决方案(你可以使用的插件)与 mvn\gradle\sbt\whatever 。

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


总体思路是:

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

在您的情况下,输出some.class(仅限于root_package)的递归依赖项应该类似于:

jdeps -v -R -e "root_package.*" some.class
Run Code Online (Sandbox Code Playgroud)

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

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


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

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

例如,Maven 有一个插件,允许在构建期间执行 groovy 脚本

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

  1. 通过管道jdeps输出到类似的内容:

    grep -Po classname_regex

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

  2. 通过管道输出grep到类似的内容:

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

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