Proguard优化设置:在现代API和Proguard版本中启用类合并,强制转换和字段/*

rup*_*pps 11 optimization android proguard

我一直在混淆我的应用程序很长一段时间,我采用了以下设置,就像咒语一样,因为它们是谷歌的推荐

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
Run Code Online (Sandbox Code Playgroud)

然而,有一天我错误地评论了这一行,该应用程序正确构建,并"显然"工作.我做了很多测试,无法让它崩溃.

所以我想知道是否需要那些禁用的优化设置......

  • 从今天的Android SDK和最新的Proguard版本开始,我只针对Android 4.0.3以后的设备(15),并使用Proguard 5.1.
  • 对于那些没有做异国情调并且有适当的书面proguard.cfg指示以保留相关问题类别的应用程序等.

与此问题相关的大多数答案都有相互矛盾的信息,并且与相当旧的API版本有关.

逐一:

!代码/简/算术

我发现了一个关于Google网上论坛的讨论 ,他们说simplification/arithmethic在Android Donut之后不需要SDK.我假设,我可以安全地启用此优化.

!类/合并/*

看起来proguard在开启此优化的项目中做得很好:

[proguard]   Number of vertically merged classes:         296
[proguard]   Number of horizontally merged classes:       445
Run Code Online (Sandbox Code Playgroud)

除了堆栈跟踪不正确之外还有其他副作用吗?我的意思是,与应用程序崩溃相关的副作用而不是调试问题.我发现了这个相关的问题,但不能得出结论是否安全.

!field/*和!code/simplification/cast

ProGuard的作者回答的这个问题中读到这些问题是为了避免使用较旧的Proguard版本的错误.那么在Proguard 5.1上激活它们是否安全?

Fab*_*amp 3

一般建议:不能保证优化不会起作用,但风险总是存在的。默认的 Android proguard 设置试图做的是提供一种配置来最大限度地降低这种风险,因此它们对于您的具体情况显得如此保守。

启用这些优化仅意味着如果出现崩溃,您无法确定根本原因。一般来说,proguard 步骤对输出相对于输入的关系的保证不太强,这是程序中不确定性的根源。代码中的微小更改可能会导致运行时行为发生显着不同的变化,并且在实际运行程序之前不可能知道,具体取决于您的配置。

总之,如果您可以运行您的 APK,并且一切正常 - 那就太好了,优化对您有用。但是,他们不能保证。