Proguard保留公共课程,领域和方法

时间:2018-01-29 20:23:34

标签: kotlin proguard android-proguard

我使用Kotlin,我有很多内部课程。 我希望对所有public类之外的所有内容进行模糊处理和缩小。

Proguard规则:

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

-optimizationpasses 5
-overloadaggressively
-repackageclasses ''
-allowaccessmodification

-keep public class * {
    public <methods>;
    public <fields>;
}

不幸的是,-keep public class *在防御方面表现得很好,并保留所有名字,也适用于内部类。

1 个答案:

答案 0 :(得分:4)

你的规则过于宽泛。

  1. Single&#34; -keep&#34;与组合&#34; -keepmembers&#34;相比,嵌套规则更广泛。和&#34; -keepclasseswithmembers&#34;规则
  2. Full&#34; -keep&#34;规则意味着&#34;不要改变该方法的字节码,而且#34;
  3. 无法删除,重命名或重新打包由保留的类和方法引用的类
  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;,在最终应用程序混淆时应遵循这些规则。