gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:44:39 24 4
gpt4 key购买 nike

背景

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

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

该应用程序使用 ZXing 进行二维码扫描/识别,在没有 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 规则?如果可以,我该怎么做?

最佳答案

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

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

请参阅 ProGuard 手册 > 使用 > Filters .

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

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

关于android - 在大型 Android 应用程序中仅为两个包启用 Proguard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20406993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com