保留规则的 Proguard/R8 例外

Posted

技术标签:

【中文标题】保留规则的 Proguard/R8 例外【英文标题】:Proguard/R8 exception to a keep rule 【发布时间】:2021-12-23 18:13:13 【问题描述】:

我正在尝试使用 R8/Proguard 删除日志记录,并且我使用了

-assumenosideeffects class android.util.Log 
    v(...);
    d(...);
    i(...);
    w(...);
    e(...);

效果很好。尝试删除com.mypackage中的自定义登录时出现的问题:

-assumenosideeffects class com.mypackage.MyCustomLogger 
    v(...);
    d(...);
    i(...);
    w(...);
    e(...);

我有一条规则,将公共类的所有公共方法都保留在com.mypackage

-keep, allowoptimization public class com.mypackage.** 
    public *;

由于项目范围,我无法删除。此规则似乎覆盖了 assumenosideeffects 规则,这是我的问题:我如何指定此保留规则的例外情况?我知道 -if 选项,但我在任何地方都没有看到它用于否定。我曾尝试在 -keep 规则之前编写 -if class !com.mypackage.Logger,但构建需要花费大量时间并且永远不会完成。

【问题讨论】:

【参考方案1】:

我找到了答案,我需要像这样在保留规则中添加我的 Logger 类:

-keep, allowoptimization public class !com.mypackage.MyCustomLogger, com.mypackage.** 
    public *;

【讨论】:

以上是关于保留规则的 Proguard/R8 例外的主要内容,如果未能解决你的问题,请参考以下文章

Proguard/R8 规则排除资产文件夹

Proguard (R8) 混淆自定义视图名称

如何修复因 ProGuard/R8 导致的崩溃?

Firebase + Proguard/R8

使用 proguard / R8 删除数据类元数据

如果在proguard中包含带有注释的字段,如何保持类的成员不受影响