历史/背景 我有一个项目[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
答案 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