2011-11-23 121 views
5

由于Android上的Scala问题,我最近需要在Android上引入ProGuard。我需要ProGuard的缩小功能,它可以删除假定未使用的类。我非常担心删除类对可测试性的影响。现在,我编写了在主机上运行的单元测试和在Android平台上运行完全集成的应用程序的验收测试。有了ProGuard,对测试策略有什么影响?

通常,我会对相对完整的单元测试覆盖率和点差验收测试覆盖感到满意。但是,鉴于在我的代码中,我大量使用了Guice依赖注入,到目前为止,我的经验是ProGuard以难以预测的方式去除代码。因此,这很可能会导致我引入错误。

这使我相信我需要编写验收/平台测试,以实现全面覆盖,因为在任何时候,都可能存在缺失的类。

别人是否有此经历?如果是这样,你的测试策略是什么?或者凭借经验,您是否更加确信ProGuard正在移除的课程确实不需要?

回答

2

的ProGuard不会打破你的应用程序,直到它试图使用反射或Class#的forName上去除类和/或混淆的成员。根据我的经验(在Android上也有模糊的Scala),使用简单烟雾测试发现ProGuard对Android应用程序造成的问题非常容易。你知道你的项目包含哪些库。如果其中一些使用反射或Class#forName - 对它们执行烟雾测试。然后从ProGuard配置中排除必要的类/成员。

还请记住,您可以使用ActivityInstrumentationTestCase2和仿真器自动化对混淆项目的测试。如果您打算在您的项目中使用ProGuard,请始终对混淆的APK执行插装测试。

总之 - 不要害怕。 ProGuard相关的问题相对容易发现。

+0

这通常是修整的,但在使用糟糕的库时要小心怪异的不一致性,比如Facebook android SDK和类似的东西。它通常会破坏事物。 –

2

我们一直在进行单元测试和“全面”测试ProGuard-ed应用程序很长一段时间,而且我们没有“真正”的问题。我们遇到的唯一问题是当我们在我们的测试中使用某些库方法时,主应用程序中没有使用这些方法;在这些情况下,ProGuard会从库中删除代码,我们必须手动将具体方法添加到proguard.cfg

哦,我们还可以使用吉斯:)

+0

从我看到的,许多Roboguice客户不明确使用Guice。你主要是使用Roboguice的Android资源注入,还是你正在与一个非平凡的Guice模块进行广泛的绑定? –

+1

我们对非roboguice的东西进行了相当多的注入。我不确定这是否会被视为“广泛绑定”和“非平凡”。我的整体印象是,你真的不应该担心,ProGuard它的工作非常好。 – dmon