Proguard 保留公共类、字段和方法

Dio*_*lor 5 proguard kotlin android-proguard

我使用 Kotlin 并且我有很多内部类。我想混淆和缩小所有public类之外的所有内容。

Proguard 规则:

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

-optimizationpasses 5
-overloadaggressively
-repackageclasses ''
-allowaccessmodification

-keep public class * {
    public <methods>;
    public <fields>;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它的-keep public class *行为具有防御性并保留所有名称,也用于内部类。

use*_*723 6

你的规则太宽泛了。

  1. 与“-keepmembers”和“-keepclasseswithmembers”规则的组合相比,带有嵌套规则的单个“-keep”更广泛
  2. 完整的“-keep”规则意味着“永远不要更改该方法的字节码”
  3. 被保留的类和方法引用的类不能被删除、重命名或重新打包

规则中的这一行保留了所有类和接口:

-keep public class * {
Run Code Online (Sandbox Code Playgroud)

我的意思是他们所有人。他们是否有公共成员。

使用-keepclasseswithmembers,而不是!

因为这些线

{
    public <methods>;
    public <fields>;
}
Run Code Online (Sandbox Code Playgroud)

您所有的公共方法都将保持不变,这意味着无法执行从您的公共方法引用的重新打包重命名方法

如果您希望至少进行一些重新打包,请确保允许优化(因为重新打包是作为优化步骤的一部分执行的):

-keepmembers,allowoptimization public class * {
    public <methods>;
    public <fields>;
}
Run Code Online (Sandbox Code Playgroud)

除了重新打包之外,这还允许进行一些内联​​(这反过来有助于删除提供内联方法的类)。

此外,对于 Android 应用程序,您最好将其重新打包到主包(应用程序包,或其中包含最多不可移动类的包)而不是空包 ( '')。这是因为 Proguard 无法将某些“导出”类(活动、视图、服务、其他内容,从 xml 文件引用)移出它们的包,aapt 会动态生成特殊规则来防止这种情况发生。将访问模式从公共更改为受保护/私有的优化过程部分变得更加高效,可以将更多类放在一起放在单个包中。

我想混淆和缩小所有公共课程之外的所有内容。

馊主意。你真的应该尽可能地混淆,尤其是公共类。如果您限制混淆,则重新包装也受到限制!它会重命名它们!!

以最具体的规则为目标。

如果你想防止收缩:

-keep,allowoptimization,allowobfuscation public class com.example.Example
Run Code Online (Sandbox Code Playgroud)

如果您想防止重命名,但允许剥离未使用的类:

-keep,allowoptimization,allowshrinking public class com.example.*
Run Code Online (Sandbox Code Playgroud)

一般来说,避免通配符规则(裸*)和-keep规则:更喜欢特定类的规则和-keepmembers/-keepclasseswithmembers


混淆应用程序和库的正确方法完全不同,但它们有一些共同点——你不应该关心公共方法/类;只是尽可能地混淆/缩小/重新打包,直到再破坏它为止。

对于应用程序,您应该尽可能地混淆/重新打包。如果您不知道混淆哪些软件包是安全的,请从选择已知的安全软件包到 obfuscation 开始

对于库 - 不要将 Proguard 应用于库本身(除非您试图通过默默无闻来实现安全性)。使用 aar 格式的特性——消费者混淆文件——允许提供规则“段”,在最终的应用程序混淆过程中应该遵循这些规则。