使用proguard for Android删除未使用的类

时间:2013-08-26 21:00:36

标签: android proguard

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

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

The library jars themselves always remain unchanged. 

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

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

2 个答案:

答案 0 :(得分:8)

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

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

所以它应该全部自动解决。如果您的配置proguard-project.txt包含-keep class org.mylibrary.** { *; }等行,您仍可以在已处理的apks中看到整个库的原始名称。这种配置通常是考虑反射的保守解决方案。通过一些研究和实验,您通常可以优化配置并获得更好的结果。您可以使用选项-whyareyoukeeping找出保留类的原因。

答案 1 :(得分:3)

我相信你必须使用-injars

  

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

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