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?
我认为你不能只用 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 脚本,您可以执行以下操作:
通过管道jdeps输出到类似的内容:
grep -Po classname_regex
...仅保留您想要保留的类名(您可以使用零长度断言来构建classname_regex)。
通过管道输出grep到类似的内容:
awk '{print "-keep class " $0}
...获取混淆器配置并将输出保存到文件。