混淆Android Test项目以及项目(在发布和混淆版本上运行测试)

时间:2013-02-04 22:03:45

标签: android testing proguard

假设我有一个带有测试的Android应用程序项目。

我们是否可以针对发布版本运行我们的测试套件(在单独的测试项目中)?

3 个答案:

答案 0 :(得分:2)

在阅读了赏金的评论后,我意识到OP实际上只是提出了一个简单的是/否回复的问题,所以我要将我的评论扩展到答案。一般来说,正确设计的proguard.cfg和项目结构足以防止这种困境。

典型的proguard配置(参见7. this link中的完整Android应用程序部分)保证在混淆期间保留所有与Android相关的内容,如Activity,View等。例如,改变配置没有任何意义,以混淆Acticity.onCreate()方法,因为它显然会在运行时破坏应用程序。换句话说,井设计proguard.cfg将保护所有公共接口到底层运行时框架并保持它们不变。

... ...

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

... ...

另一方面,Android测试项目应该专注于测试Android组件(在模糊处理期间有意保留),即一个视图被正确呈现,一个按钮点击执行正确的任务,并应该避免编写没有的POJO类测试依赖于任何Android API,请注意这些POJO通常是我们混淆的。最好在应用程序或引用的java项目中为这些POJO编写纯junit测试,以便在创建最终版本(模糊,签名和zipaligned)之前在maven测试阶段涉及这些junit测试。此外,良好的OO设计将屏蔽这些中间POJO依赖关系,并使它们对外部透明,即运行时框架。

app/
  src/main/java/
  src/test/java/  <-- intermediate POJO tests put here.
  AndroidManifest.xml
  ... ...
app-test/
  src/main/java  <-- Android component tests put here.
  AndroidManifest.xml
  ... ...

在Android测试项目中编写POJO junit测试是绝对正常的,但是,如果您仍然希望能够针对混淆的apk运行测试项目,则需要正确调整应用程序项目的proguard.cfg并保留POJO类在混淆期间为了适合测试代码。

答案 1 :(得分:1)

您可以指示proguard使用-printmapping <filename>指令将其创建的映射写出到文件中。该文件的结构很明显,可以解析为Hashtable。然后我会编写一个脚本,将这些转换应用到您的测试中(制作它们的副本)。混淆只是意味着将类和方法名称从Java字节码规范(人类可读和有效)替换为其他(简短且不可读但也)有效的东西,因此这应该有效。针对混淆的项目编译适应的测试并运行它们。

答案 2 :(得分:0)

您是否在一个项目中拥有测试和来源?如果是这样我相信android maven会在你执行发布时删除测试代码。

要解决此问题,您需要将测试移动到链接到您的实际应用程序的单独项目(假设您依赖于实际项目的代码/资产),那么单独的项目仍然可以针对发布版本进行检测您的应用程序(假设它们是由相同的密钥签名)。