我最近需要在Android上介绍ProGuard,因为Android上的Scala存在问题。我需要ProGuard的收缩功能,它可以删除假定未使用的类。我非常担心移除类对可测试性的影响。
目前,我编写在主机上运行的单元测试和在Android平台上运行完全集成的应用程序的验收测试。
通常,我对相对完整的单元测试覆盖率和零星的验收测试覆盖率感到满意。然而,考虑到我在代码中大量使用Guice依赖注入,到目前为止,根据我的经验,ProGuard以一种我很难预测的方式删除代码。因此,这很可能导致我引入错误。
这使我相信我需要编写实现完全覆盖的验收/平台测试,因为在任何时候,都可能有一个缺失的类。
其他人有这样的经历吗?如果有,你的测试策略是什么?或者随着经验的积累,你是否更加确信ProGuard正在删除的类确实是不需要的?
ProGuard将不会破坏您的应用程序,直到它试图在删除的类和/或混淆的成员上使用反射或class# forName。
根据我的经验(在Android上也有混淆的Scala),使用简单的烟雾测试很容易发现ProGuard对Android应用程序造成的问题。您知道项目中包含哪些库。如果其中一些使用反射或class# forName -对它们执行冒烟测试。然后从ProGuard配置中排除必要的类/成员。
还请记住,您可以使用ActivityInstrumentationTestCase2和模拟器自动测试您的混淆项目。如果您计划在您的项目中使用ProGuard,请始终在混淆的APK上执行仪表测试。
总之——不要害怕。与proguard相关的问题相对容易发现。
我们已经对ProGuard-ed应用程序进行单元测试和"全面"测试有一段时间了,我们还没有遇到"真正的"问题。我们遇到的唯一问题是,当我们在测试中使用一些没有在主应用程序中使用的库方法时;在这种情况下,ProGuard将从库中删除代码,我们将不得不手动添加特定的方法到proguard.cfg
。
哦,我们还使用Guice:)