【发布时间】:2019-03-15 10:22:34
【问题描述】:
在 Android Studio 3.2 中使用 Android 项目,启用 Proguard 和一些特定规则后,我无法弄清楚以下内容:
客户端代码使用的库模块中的特定包(及其子包)通过规则保留:
-keep public class com.mylib.mypackage.** {
public protected *;
}
现在,在这个包中还有一些包私有类,这些类不应该被该规则选中。其中一些类在它们自己的名称和成员名称中都被有效地混淆了,这很好。
相反,有一些类实现了公共接口,它们的类名没有被混淆,而我希望它们应该被混淆。为了完整起见,它们的成员名称,当不是接口的一部分时,会被有效地混淆。
例子:
/* package */ class InternalComponent implements ExternalInterface {
// ExternalInterface is kept: Ok
// InternalComponent is kept: don't like, I'd like it renamed
@Override
public void ExternalMethod() {
// this is kept: Ok
}
public void InternalMethod() {
// this is renamed: Ok
}
}
我想强调 InternalComponent 是在其他(保留)类中创建的,并且仅通过 ExternalInterface 返回给客户端代码。
如果可能的话,我如何也可以混淆它们的类名?
编辑 #1
在@emandt 回答 Proguard 输出文件后,我仔细检查了 com.mylib.mypackage.InternalComponent 并在 seeds.txt 中列出,根据 this blog post 列出了所有与保留规则匹配的项目。所以,出于某种原因,上面的规则也选择了包私有类,这对我来说仍然是错误的。
编辑#2
与此同时,我最终采用了与@shizhen 提出的完全相同的方法。为了完整起见,为了将排除扩展到 any 名为 internal 的包,我将我的 proguard 规则修改为:
-keep public class !com.mylib.mypackage.**.internal.*, com.mylib.mypackage.** {
public protected *;
}
(注意逗号前的第一部分,前缀为!)
我会标记@shizhen 的答案,不过我想知道为什么原来的规则也选择包私有组件。
【问题讨论】:
标签: android proguard obfuscation android-proguard