背景
我正在开发一个依赖于多个外部库的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
规则。
这种方法有两大缺点:
添加或交换库需要更改Proguard配置文件
它使更新库变得很麻烦,因为它们中的一些被混淆,并且当库的开发人员重新编译时,会更改包名称。
显然,我希望尽可能避免这种方法(因为外部库的数量很多)。
问题
是否可以使用Proguard来混淆两个软件包,而不为我的应用程序中的每个其他软件包定义-keep
规则?如果是这样,我该怎么做?
答案 0 :(得分:3)
正确的语法是逗号分隔的列表,没有任何括号:
-keep class !com.google.zxing.**,!com.example.app.** { *; }
请参阅ProGuard手册>用法> Filters
请注意,这一行已经暗示了接口和枚举的另外两行。您可以通过不让最后一个通配符匹配子包来暗示所有子包的-keep选项:
-keep class !com.google.zxing.**,!com.example.app.* { *; }