【问题标题】:remove unused classes with proguard for Android使用 proguard for Android 删除未使用的类
【发布时间】:2013-08-26 21:00:35
【问题描述】:

历史/背景 我有一个项目[1],其中大小真的很重要——最近我将东西移到了共享库 [2] 并认为 proguard 会照顾并删除未使用的类,因为我有一个配置可以大大减小大小但使用库我遇到了神奇的 100kb 标记,所以我进行了调查:我确定不使用的类在生成的 dex 文件中——甚至是全名(不缩短为单字符)——例如我在 dex 中看到了 SquareView,我在 App 中没有使用过。

问题 令人惊讶的是,我在 proguard 文档中发现了以下内容:

The library jars themselves always remain unchanged. 

我可以以某种方式告诉/欺骗 proguard (in) 来处理它们吗?我觉得这真的很奇怪,特别是因为我希望在 lib 中可以删除的东西比在应用程序本身中要多..

[1]https://github.com/ligi/FAST [2]https://github.com/ligi/AndroidHelper

【问题讨论】:

    标签: android proguard


    【解决方案1】:

    Android SDK 中的 Eclipse/Ant/Gradle 构建过程会使用选项 -injars 自动指定您的代码(来自 bin/classes)及其库(来自 libs)。这意味着整个应用程序被压缩、优化和混淆(在发布版本中,假设启用了 ProGuard)。

    构建过程仅使用选项-libraryjars 指定Android 运行时android.jar。处理代码是必要的,但它不应出现在已处理的 apk 中,因为它已经存在于设备上。

    所以这一切都应该自动解决。如果您的配置 proguard-project.txt 包含像 -keep class org.mylibrary.** { *; } 这样的行,您可能仍然会在已处理的 apk 中看到具有原始名称的整个库。这种配置通常是考虑反射的保守解决方案。通过一些研究和实验,您通常可以改进配置并获得更好的结果。您可以使用 -whyareyoukeeping 选项了解为什么要保留课程。

    【讨论】:

      【解决方案2】:

      相信你一定要用-injars:

      -injars 类路径 指定要处理的应用程序的输入 jars(或 war、ears、zip 或目录)。这些 jar 中的类文件将是 处理并写入输出罐子。默认情况下,任何非类 文件将被复制而不做任何更改。请注意任何临时的 文件(例如,由 IDE 创建),尤其是在您阅读输入时 直接来自目录的文件。类路径中的条目可以是 过滤,如过滤器部分所述。为了更好的可读性, 可以使用多个 -injars 选项指定类路径条目。

      来源:http://proguard.sourceforge.net/index.html#manual/usage.html

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      相关资源
      最近更新 更多