gpt4 book ai didi

android - 为什么一些包私有(private)类没有被 Proguard 混淆?

转载 作者:太空狗 更新时间:2023-10-29 14:38:05 25 4
gpt4 key购买 nike

在 Android Studio 3.2 中处理 Android 项目,启用了 Proguard 和一些特定规则,我无法弄清楚以下内容:

客户端代码使用的库模块中的特定包(及其子包)通过规则保留:

-keep public class com.mylib.mypackage.** {
public protected *;
}

现在,在这个包中还有许多包私有(private)类,不应该被该规则选中。其中一些类在它们自己的名称和成员名称中都被有效地混淆了,这很好。

取而代之的是一些实现公共(public)接口(interface)的类,其类名未被混淆,而我希望它们应该被混淆。为了完整起见,它们的成员名称(如果不是接口(interface)的一部分)会被有效地混淆。

例子:

/* 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列出符合 keep 规则的所有项目。所以,出于某种原因,上面的规则也选择了包私有(private)类,这对我来说仍然是错误的。

编辑#2与此同时,我最终采用了@shizhen 提出的完全相同的方法。为了完整起见,为了将排除扩展到名为 internal任何包,我将我的混淆器规则修改为:

-keep public class !com.mylib.mypackage.**.internal.*, com.mylib.mypackage.** { 
public protected *;
}

(注意逗号前的第一部分,以!为前缀)

我会标记@shizhen 的答案,尽管我想知道为什么原始规则也选择包私有(private)组件。

最佳答案

您正在从事 Android 库 项目吗?可能是。

为了实现您的目的,恐怕您需要将您的包重新组织成如下所示:

公共(public)接口(interface)

com.my.package.apiforusers

私有(private)/内部实现

com.my.package.apiforusers.internal

然后对于你的混淆规则,你可以像下面这样:

-keep public class com.my.package.apiforusers.** { public *; }

这样公共(public)类/接口(interface)会被保留,com.my.package.apiforusers.internal 中的所有那些都将被混淆。

请注意末尾的双星号,以便子包也保留公共(public)类/接口(interface)。

关于android - 为什么一些包私有(private)类没有被 Proguard 混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52741362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com