【问题标题】:Enable Proguard for only two packages in large Android application为大型 Android 应用程序中的两个包启用 Proguard
【发布时间】:2013-12-05 17:44:18
【问题描述】:

背景

我正在开发一个依赖多个外部库的 Android 应用程序(8 个作为库项目依赖项添加,14 个作为 jar 依赖项添加)。

其中一些 jar 库是封闭源代码并且已经被混淆,其中一些非常依赖反射。

应用程序使用 ZXing 进行 QR 码扫描/识别,并且在没有 Proguard 优化的情况下,ZXing 非常慢(至少在 Android 上)。

起初,我只需要使用 Proguard 优化 com.google.zxing.** 包。为了做到这一点,我在我的配置文件中添加了以下 Proguard 选项(我可以从 this question 中找到最好的选项):

-keep class !com.google.zxing.** { *; }
-keep interface !com.google.zxing.** { *; }
-keep enum !com.google.zxing.** { *; }
-dontwarn !com.google.zxing.**

我导出了我的应用程序,它就像一个魅力。

问题

现在,我想使用 Proguard 来混淆应用程序的类。

我已尝试将以上内容更改为:

-keep class !(com.google.zxing.**, com.example.app.**) { *; }
-keep interface !(com.google.zxing.**, com.example.app.**) { *; }
-keep enum !(com.google.zxing.**, com.example.app.**) { *; }
-dontwarn !(com.google.zxing.**, com.example.app.**)
-keep com.example.app.activities.** { *; }
-keep com.example.app.receivers.** { *; }
-keep com.example.app.services.** { *; }
-keep com.example.app.views.** { *; }

问题在于 Proguard 不接受 !(package.one.**, second.package.**) { *; } 作为 -keep 规则的有效选项。

另一种方法是为我的应用程序中的每个包设置-keep 规则。

这种方法有两大缺点:

  1. 添加或交换库需要更改 Proguard 配置文件

  2. 它使更新库变得很痛苦,因为其中一些库被混淆了,并且当库的开发人员重新编译时,会更改包名称。

显然,我想尽可能避免这种方法(因为外部库的数量很大)。

问题

是否可以使用 Proguard 只混淆两个包,而不为我的应用程序中的每个其他包定义 -keep 规则?如果是这样,我该怎么做?

【问题讨论】:

    标签: android config proguard


    【解决方案1】:

    正确的语法是逗号分隔的不带括号的列表:

    -keep class !com.google.zxing.**,!com.example.app.** { *; }
    

    请参阅 ProGuard 手册 > 用法 > Filters

    请注意,这一行已经暗示了接口和枚举的另外两行。您可以通过不让最后一个通配符匹配子包来暗示所有子包的 -keep 选项:

    -keep class !com.google.zxing.**,!com.example.app.* { *; }
    

    【讨论】:

    • 我认为com.google.zxing.**,com.example.app.** 意味着将所有课程保留在com.google.zxing 中,并且全部保留在com.example.app 中,而!com.google.zxing.**,!com.example.app.** 将意味着保留所有课程不在com.google.zxing 中并且全部不在com.example.app (这样任何一个包都会落入另一个包的否定范围)。当我开始工作时,我一定会试一试,如果它有效,我会将你的答案标记为已接受。谢谢!
    • 您必须将过滤器作为列表读取。 !x,!y 表示不是 x,不是 y,而是其他任何东西。
    • 感谢您的评论!它帮助我更好地理解如何查看 Proguard 规则。我还没有尝试过,因为我还有一些更紧迫的问题要解决,但是,看看你的个人资料,我认为我可以马上接受答案:)。我会在试用后发表评论,以向遇到相同问题的其他人确认这一点。
    • 我刚刚对此进行了测试,它可以工作。非常感谢!
    • 它仍然对您有用吗?我无法让它工作并提交stackoverflow.com/questions/59248681/…因此
    猜你喜欢
    • 1970-01-01
    • 2014-03-15
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多