我使用Kotlin,我有很多内部课程。
我希望对所有public
类之外的所有内容进行模糊处理和缩小。
Proguard规则:
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
-optimizationpasses 5
-overloadaggressively
-repackageclasses ''
-allowaccessmodification
-keep public class * {
public <methods>;
public <fields>;
}
不幸的是,-keep public class *
在防御方面表现得很好,并保留所有名字,也适用于内部类。
答案 0 :(得分:4)
你的规则过于宽泛。
规则中的这一行保留所有你的类和接口:
-keep public class * {
我的意思是所有人。他们是否有公共成员。
改为使用-keepclasseswithmembers
!
因为这些行
{
public <methods>;
public <fields>;
}
所有公开方法都不会受到影响,这意味着无法执行重新打包和重命名方法,这些方法是从公共方法引用的!
如果您希望至少进行一些重新包装,请确保允许优化(因为重新包装是在优化步骤中执行的):
-keepmembers,allowoptimization public class * {
public <methods>;
public <fields>;
}
除了重新打包之外,这还将允许一些内联(这反过来有助于删除提供内联方法的类)。
对于Android应用程序,您最好重新打包到主程序包(应用程序包或包含最多不可移动类的程序包)而不是空包(''
)。这是因为一些&#34;导出&#34;不能通过Proguard将类(活动,视图,服务,其他东西,从xml文件引用)移到其包之外, - aapt动态生成特殊规则来防止这种情况发生。优化过程的一部分,将访问模式从公共更改为受保护/私有,在单个包中将更多类放在一起变得更有效。
我想混淆和缩小所有公共课程之外的所有内容。
糟糕的主意。你真的应该尝试尽可能地混淆,尤其是公共类。如果限制混淆,重新包装也会受到限制!它会重命名它们!!
尽可能针对最具体的规则。
如果你想防止萎缩:
-keep,allowoptimization,allowobfuscation public class com.example.Example
如果您想阻止重命名,但允许剥离未使用的类:
-keep,allowoptimization,allowshrinking public class com.example.*
通常,请避免使用通配符规则(裸*
)和-keep
规则:首选特定类的规则和-keepmembers
/ -keepclasseswithmembers
混淆应用程序和库的正确方法完全不同,但它们有一些共同之处 - 你不应该关心公共方法/类;只是尽可能地混淆/收缩/重新包装,直到任何破坏它为止。
对于应用程序,您应该尽可能地混淆/重新打包。如果您不知道哪些软件包可以安全地进行模糊处理,请从opting known safe packages into obfuscation开始。
对于图书馆 - 不要将Proguard应用于图书馆本身(除非您试图通过默默无闻来实现安全性)。使用aar格式的功能 - consumer proguard files - 允许提供规则&#34;段&#34;,在最终应用程序混淆时应遵循这些规则。