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
? B
、C
和 Clazz
?
内部引用的所有 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 脚本,您可以执行以下操作:
pipe jdeps
输出为:
grep -Po classname_regex
... 只保留 class 你想保留的名称(你可以使用零长度断言来构建 classname_regex
)。
将 grep
的输出管道输出为类似以下内容:
awk '{print "-keep class " [=21=]}
...获取混淆器配置并将输出保存到文件。
假设我有结构:
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
? B
、C
和 Clazz
?
我不认为你可以只用混淆器来做到这一点,我真的怀疑是否有一个直接的解决方案(你可以使用插件)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 脚本,您可以执行以下操作:
pipe
jdeps
输出为:grep -Po classname_regex
... 只保留 class 你想保留的名称(你可以使用零长度断言来构建
classname_regex
)。将
grep
的输出管道输出为类似以下内容:awk '{print "-keep class " [=21=]}
...获取混淆器配置并将输出保存到文件。