如何使 ProGuard 保留整个(整个)类(带有字段和方法)而不使用“-keep”

Posted

技术标签:

【中文标题】如何使 ProGuard 保留整个(整个)类(带有字段和方法)而不使用“-keep”【英文标题】:How to make ProGuard keep entire (whole) classes (with fields and methods) without using "-keep" 【发布时间】:2012-07-06 15:13:06 【问题描述】:

如果我有一个 Scala android 项目并且我在我的 apk 中使用这些方法...

scala.collection.immutable.List#::
scala.collection.immutable.List#:::

...,在我使用 ProGuard 之后,它会保留 scala.collection.immutable.List 类,只有 2 个方法,:::::

ProGuard 中是否有一个选项可以将 ALL 方法和字段保留在类中,即使它们当前未使用,但不发送 ProGuard:-keep class scala.collection.immutable.List *;

【问题讨论】:

你不能做类似-keep class scala.** *;的事情吗? 【参考方案1】:

我发现我这样做的唯一方法是确定在我的编译类中使用了哪些类和方法。

我通过Map[String, Set[String]] 数据结构映射它们,其中键是类名,对应的Set 值包含该类中使用的所有方法。

之后,只需创建大量-keep argumetns:

def getProGuardKeepArgs(allDeps: MMap[String, MSet[String]]): String = 
    var sb = new StringBuilder()
    for ((clazz, methods) <- allDeps) 
        sb.append("-keep class " + clazz + " \n")

        for (method <- methods) 
            sb.append(" *** " + method + "(...);\n")
        

        sb.append("\n\n")
    

    sb.toString

【讨论】:

以上是关于如何使 ProGuard 保留整个(整个)类(带有字段和方法)而不使用“-keep”的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止proguard混淆整个包?

如果在proguard中包含带有注释的字段,如何保持类的成员不受影响

如何排除一个类被proguard保留

Proguard:如何避免缩小(和混淆)整个包以避免删除(和混淆)“未使用的方法”?

Proguard 不会保留班级成员的枚举

Proguard 保留 R 类