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 *
行为具有防御性并保留所有名称,也用于内部类。
你的规则太宽泛了。
规则中的这一行保留了所有类和接口:
-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 格式的特性——消费者混淆文件——允许提供规则“段”,在最终的应用程序混淆过程中应该遵循这些规则。
归档时间: |
|
查看次数: |
9769 次 |
最近记录: |