【发布时间】: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 规则。
这种方法有两大缺点:
添加或交换库需要更改 Proguard 配置文件
它使更新库变得很痛苦,因为其中一些库被混淆了,并且当库的开发人员重新编译时,会更改包名称。
显然,我想尽可能避免这种方法(因为外部库的数量很大)。
问题
是否可以使用 Proguard 只混淆两个包,而不为我的应用程序中的每个其他包定义 -keep 规则?如果是这样,我该怎么做?
【问题讨论】: