为什么一些 package-private 类 没有被 Proguard 混淆?
Why some package-private classes are not obfuscated by Proguard?
在 Android Studio 3.2 中使用 Android 项目,在启用 Proguard 和一些特定规则后,我无法弄清楚以下内容:
客户端代码使用的库模块中的特定包(及其子包)通过规则保留:
-keep public class com.mylib.mypackage.** {
public protected *;
}
现在,在这个包中还有一些包私有 classes,不应该被该规则选中。其中一些 classes 在它们自己的名称和成员名称中都被有效地混淆了,这很好。
相反,有一些 classes,实现 public 接口,其 class 名称未被混淆,而我希望它们应该被混淆。为了完整起见,它们的成员名称(如果不是接口的一部分)会被有效地混淆。
示例:
/* 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
是在其他(保留的)class 中创建的,并且仅通过 ExternalInterface
.
返回给客户端代码
如果可能的话,我怎样才能同时混淆他们的 class 名字?
编辑 #1
在@emandt 回答 Proguard 输出文件后,我仔细检查并在 seeds.txt
中列出了 com.mylib.mypackage.InternalComponent
,根据 this blog post 列出了保留规则匹配的所有项目。所以,出于某种原因,上面的规则也选择了 package-private classes,这对我来说仍然是错误的。
编辑 #2
与此同时,我最终采用了@shizhen 提出的完全相同的方法。为了完整起见,为了将排除扩展到名为 internal
的 any 包,我将我的混淆器规则修改为:
-keep public class !com.mylib.mypackage.**.internal.*, com.mylib.mypackage.** {
public protected *;
}
(注意逗号前的第一部分,前缀为!
)
我会标记@shizhen 的答案,虽然我想知道为什么原来的规则也选择包私有组件。
在“/build/outputs/mapping/release/”文件夹中有几个文件("usage.txt"、"seeds.txt" 等..)包含原因和原因 classes/variables/methods/etc。 . 是 not-processed/not-shrinked/ot-obfuscated 通过 ProGuard 实用程序。
您正在从事 Android 图书馆 项目吗?可能是。
为了达到您的目的,恐怕您需要将您的包重新组织成如下所示:
Public 接口
com.my.package.apiforusers
Private/Internal 实现
com.my.package.apiforusers.internal
那么对于你的混淆规则,你可以像下面这样:
-keep public class com.my.package.apiforusers.** { public *; }
这样 只有 public classes/interfaces 被保留,com.my.package.apiforusers.internal
中的所有那些都将被混淆。
请注意末尾的双星号,以便子包也保留 public classes/interface。
在 Android Studio 3.2 中使用 Android 项目,在启用 Proguard 和一些特定规则后,我无法弄清楚以下内容:
客户端代码使用的库模块中的特定包(及其子包)通过规则保留:
-keep public class com.mylib.mypackage.** {
public protected *;
}
现在,在这个包中还有一些包私有 classes,不应该被该规则选中。其中一些 classes 在它们自己的名称和成员名称中都被有效地混淆了,这很好。
相反,有一些 classes,实现 public 接口,其 class 名称未被混淆,而我希望它们应该被混淆。为了完整起见,它们的成员名称(如果不是接口的一部分)会被有效地混淆。
示例:
/* 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
是在其他(保留的)class 中创建的,并且仅通过 ExternalInterface
.
如果可能的话,我怎样才能同时混淆他们的 class 名字?
编辑 #1
在@emandt 回答 Proguard 输出文件后,我仔细检查并在 seeds.txt
中列出了 com.mylib.mypackage.InternalComponent
,根据 this blog post 列出了保留规则匹配的所有项目。所以,出于某种原因,上面的规则也选择了 package-private classes,这对我来说仍然是错误的。
编辑 #2
与此同时,我最终采用了@shizhen 提出的完全相同的方法。为了完整起见,为了将排除扩展到名为 internal
的 any 包,我将我的混淆器规则修改为:
-keep public class !com.mylib.mypackage.**.internal.*, com.mylib.mypackage.** {
public protected *;
}
(注意逗号前的第一部分,前缀为!
)
我会标记@shizhen 的答案,虽然我想知道为什么原来的规则也选择包私有组件。
在“/build/outputs/mapping/release/”文件夹中有几个文件("usage.txt"、"seeds.txt" 等..)包含原因和原因 classes/variables/methods/etc。 . 是 not-processed/not-shrinked/ot-obfuscated 通过 ProGuard 实用程序。
您正在从事 Android 图书馆 项目吗?可能是。
为了达到您的目的,恐怕您需要将您的包重新组织成如下所示:
Public 接口
com.my.package.apiforusers
Private/Internal 实现
com.my.package.apiforusers.internal
那么对于你的混淆规则,你可以像下面这样:
-keep public class com.my.package.apiforusers.** { public *; }
这样 只有 public classes/interfaces 被保留,com.my.package.apiforusers.internal
中的所有那些都将被混淆。
请注意末尾的双星号,以便子包也保留 public classes/interface。