4

在导出的应用程序工作,我必须使用相同的proguard.cfg下面一节旨在静噪所有Log.x()logcat的输出相同的应用程序的两个版本:proguard.cfg不利用图书馆

-assumenosideeffects class android.util.Log { 
    public static *** v(...); 
    public static *** i(...); 
    public static *** d(...); 
    public static *** w(...); 
    public static *** e(...); 
} 

第一个版本是单一的(即不参考任何图书馆项目),proguard.cfg就像预期的那样在那里工作。

第二个版本使用两个库项目(一个是我的,另一个是谷歌的LVL)。同样的proguard.cfg被放置在应用程序项目和我的库项目中。但是,在第二个版本中,proguard.cfg似乎根本没有效果!

有什么可以解释这一点?

回答

2

你做你的应用程序项目中添加proguard.config=proguard.cfgbuild.properties?您应该看到ProGuard的控制台消息和输出文件。优化过程至少应该提到一些“已删除指令的数量”。

应用程序类和库类都被编译为bin/classes。然后对它们进行完全相同的处理:将它们合并到bin/original.jar中,并使用proguard.cfg将其模糊化为bin/obfuscated.jar。添加更多的类对于删除日志代码并不会产生影响。

+0

+1已经,因为你提示我比较' Library项目和应用程序项目之间的default.properties。果然,这行存在于库项目中,但不存在于应用程序项目中!从单一项目转移到基于图书馆的项目的方式还有另一个陷阱......我会尽快测试这个变化,并接受这个变化是否是罪魁祸首。 – an00b

+0

刚刚测试过你的建议(将'proguard.config = proguard.cfg'添加到**应用程序的**项目中),并且它可以工作! :) – an00b

1

请使用此开关来诊断: -whyareyoukeeping

+0

+1突出显示这个开关(这是不是在我的'proguard.cfg') – an00b

0

要在我的应用程序禁用日志,我用这个:

-assumenosideeffects public class android.util.Log { 
    <methods>; 
} 

如果不解决您的问题,那么有几个其他的事情尝试:

  1. 在抛出一个异常代码proguard的一部分应该是混淆。如果堆栈跟踪未被模糊处理,则proguard可能无法正常运行。
  2. 当您执行proguard构建时,您的应用程序无法启用调试。可以肯定的是,在您的清单中,<application>元素设置为android:debuggable="false"
+0

感谢您的帮助。在我的图书馆项目和我的应用程序项目中都没有任何'android:debuggable =“false”',然而在应用@Eric Lafortune的建议之后,Proguard仍然工作。 – an00b