【问题标题】:Why do we have to exclude library from ProGuard obfuscation?为什么我们必须从 ProGuard 混淆中排除库?
【发布时间】:2015-06-11 20:16:25
【问题描述】:

我知道规则是,如果我们希望 ProGuard 正常工作,我们应该从 ProGuard 混淆中排除(例如,不混淆)库。这就是所有教程停止的地方。

在幕后,这是什么原因?是不是因为它没有和我们项目一样的包名?我知道这是强制性的,因为当我忘记从 ProGuard 混淆中排除此类库时,我遇到了可怕的故事。

这条规则是否适用于我们自己的图书馆项目?它们也有不同的包名,但是虽然公共项目不需要被混淆,但我们自己的库确实必须被混淆。

显然,我在 ProGuard 知识方面有一个整体,无法制定质量混淆计划,因为我上面提出的问题并没有给我清晰易懂的答案。

【问题讨论】:

  • 您从哪里听说您应该从 proguard 中排除整个库?这不是真的。
  • 好吧,我们不会混淆它们,这就是我在排除下的意思。我的结论是,在遇到 Facebook 问题后,支持库、gson 和许多其他第三方库。

标签: android android-proguard


【解决方案1】:

图书馆项目可以被混淆和最小化。无需将库完全排除在混淆或缩小之外。

某些库确实需要特殊规则来确保它们正常工作,而导致这种情况的原因延伸到您自己的库。问题不在于它们是图书馆这一事实,而是与图书馆的工作有关。

GSON,例如要求您添加此行:

-keepattributes Signature

他们的sample proguard file 方便地提供了这样的解释:

# Gson uses generic type information stored in a class file when working with fields.
# Proguard removes such information by default, so configure it to keep all of it.

出于类似的原因,您需要告诉 proguard 忽略 GSON 将进行序列化或反序列化的模型。由于 GSON 使用反射工作,因此您需要确保成员字段没有被混淆,否则 GSON 将不知道要查找哪些字段。

虽然我似乎记得过去在使用 Facebook 时遇到过问题,但他们的 documentation currently explicitly states 表示您不需要对 Proguad 做任何特别的事情。

【讨论】:

    【解决方案2】:

    ProGuard 可以应用于任何库或模块

    以下是有关 ProGuard 的更多信息: 1)http://developer.android.com/tools/help/proguard.html 2)https://www.youtube.com/watch?v=PSpL2tShmAY

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      相关资源
      最近更新 更多