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

Sni*_*las 5 testing android proguard

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

有没有什么办法可以针对发布版本运行我们的测试套件(在一个单独的测试项目中)?

yor*_*rkw 3

阅读赏金评论后,我意识到OP实际上问的不仅仅是简单的是/否答复,所以我将把我的评论扩展到答案。一般来说,设计合理的 proguard.cfg 和项目结构足以防止这种困境。

典型的 proguard 配置(请参阅此链接中的第 7 节:完整的 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*(...);
}

... ...
Run Code Online (Sandbox Code Playgroud)

另一方面,Android 测试项目应该专注于测试 Android 组件(在混淆过程中有意保留),即视图正确呈现,单击按钮执行正确的任务,并且应该避免为不依赖于任何内容的 POJO 类编写测试。 Android API,注意这些POJO是我们通常混淆的。最好在应用程序或引用的 java 项目中为这些 POJO 编写纯 junit 测试,以便在创建最终版本(混淆、签名和压缩对齐)之前在 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
  ... ...
Run Code Online (Sandbox Code Playgroud)

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