【问题标题】:Please explain couple of proguard keywords请解释几个proguard关键字
【发布时间】:2014-10-23 22:04:02
【问题描述】:

你们中的任何人都愿意改写(用你自己的话)对他们手册中写的一些 proguard 关键字的解释吗?我很难完全理解其中一些是什么意思,以及如果 .cfg 文件中没有它们会发生什么变化。

我感兴趣的关键字是: 1) -dontskipnonpubliclibraryclasses 和 -dontskipnonpubliclibraryclassmembers

第二个被解释为:

指定不忽略包可见的库类成员(字段和方法)。默认情况下,ProGuard 在解析库类时会跳过这些类成员,因为程序类通常不会引用它们。然而,有时,程序类与库类驻留在同一个包中,并且它们确实引用了它们的包可见类成员。在这些情况下,实际读取类成员会很有用,以确保处理后的代码保持一致。

首先,它是否仅在外部 jar 的上下文中引用?其次,这些标志存在于 .cfg 文件中与不存在有什么区别?

2) -libraryjars,我迷路了。这个关键字的目的是什么?在 proguard 手册页上写着:

指定要处理的应用程序的库 jars(或 aars、wars、ears、zip、apk 或目录)。

这是否意味着,如果我不使用这个标志,那么那些罐子就不会被放在整个混淆过程中?但是如果是这样的话,那为什么我不使用这个关键字的时候,proguard输出的那些jar中的类会有很多警告呢?

接下来说:

这些 jar 中的文件不会包含在输出 jar 中。

具体是什么意思?这意味着,如果设置了这个标志,那么除了 .class 文件之外的所有其他文件都不会包含在父应用程序的 jar 中?

【问题讨论】:

    标签: android proguard


    【解决方案1】:

    经过几个小时的阅读,我想我得到了答案。特别是帮助我阅读了 StackOverflow 上许多 ProGuard 的创建者的答案。

    让我从罐子主题开始。 Libraryjars 通常是 platfrom jar,应用程序是针对构建的,所以 android.jar 是一个很好的例子。这个 jar 不会被处理,它的类不会驻留在输出 apk 中,因为它们都在客户端设备上。它们不会被混淆或缩小,因为a)即使它们不会被复制到输出apk中,并且b)如果它们被混淆,那么它将导致应用程序崩溃,因为说混淆期间的活动将具有名称更改为“a”,但在客户端设备上,android API 未更改。

    所以 libraryjars 用于 proguard 在处理我们的应用程序时需要的所有 jars,但最终的 apk 中不会包含哪些 jars(或它的类文件)。

    另一方面,Injars 是我们想要缩小/混淆等的所有 jars(除非我们使用 keep* 关键字)。

    现在我遇到这么多困难的原因是因为到处都有关于这些关键字的相互矛盾的信息。有人说使用-injars,有人说使用-libraryjars,有人说neighter。后来我发现,最后一个答案是正确的。不需要 -libraryjars 或 -injars 关键字,因为 ADT 为开发人员完成了所有这些工作,并且它使用 -injars 关键字以及所有位于 /libs 文件夹中的 jar。

    这也是为什么我发现很多人在其中一个 jar 的包中使用“keep”关键字来忽略它的混淆/收缩的原因。原因是因为 ADT 默认使用 -injars 关键字来处理这些 jars(而不是 libraryjars 在这种情况下本质上会做同样的事情),所以这些 jars 被标记为要处理(混淆/缩小)。为了消除这种影响,人们对这些 jar 的包使用 -keep 关键字。

    至于第一个问题:

    首先,它是否仅在外部 jar 的上下文中引用? 答案是否定的。它引用了所有的库,甚至在附加的 jar 中引用了

    其次,这些标志位于 .cfg 文件中与不存在有什么区别?据我发现,它是为了帮助 ProGuard 处理这些库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      相关资源
      最近更新 更多