使用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
返回到客户端代码 .
如果可能的话,我怎样才能混淆他们的 class 名称呢?
Edit
在@emandt回答Proguard输出文件后,我仔细检查了 com.mylib.mypackage.InternalComponent
列在 seeds.txt
中,根据this blog post列出了保留规则匹配的所有项目 . 所以,出于某种原因,上面的规则也选择了包私有类,这对我来说仍然是错误的 .
Edit #2 与此同时,我最终采用了@shizhen提出的完全相同的方法 . 为了完整性,为了将排除扩展到任何名为 internal
的包,我将我的proguard规则修改为:
-keep public class !com.mylib.mypackage.**.internal.*, com.mylib.mypackage.** {
public protected *;
}
(注意逗号前的第一部分,前缀为 !
)
我将标记@shizhen的答案,但我想好奇为什么原始规则也在挑选包私有组件 .
2 回答
在“/ build / outputs / mapping / release /”文件夹中,有几个文件(“usage.txt”,“seeds.txt”等等)包含原因和类/变量/方法/等的原因 . . 未通过ProGuard实用程序处理/未处理/未经过混淆 .
你在 Android Library 项目上工作吗?可能是 .
为了实现您的目的,我担心您需要将包重新组织成如下所示:
Public interfaces
Private/Internal implementations
然后,对于您的混淆规则,您可以如下所示:
所以 only 保留了公共类/接口,并且
com.my.package.apiforusers.internal
中的所有那些都将被混淆 .