在大型Android应用程序中仅为两个软件包启用Proguard

时间:2013-12-05 17:44:18

标签: android config proguard

背景

我正在开发一个依赖于多个外部库的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. 它使更新库变得很麻烦,因为它们中的一些被混淆,并且当库的开发人员重新编译时,会更改包名称。

  3. 显然,我希望尽可能避免这种方法(因为外部库的数量很多)。

    问题

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

1 个答案:

答案 0 :(得分:3)

正确的语法是逗号分隔的列表,没有任何括号:

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

请参阅ProGuard手册>用法> Filters

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

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