【问题标题】:Android Unit Tests with proguard enabled启用 proguard 的 Android 单元测试
【发布时间】:2014-12-16 09:46:55
【问题描述】:

我有一个问题,即 Proguard 会删除我的调试 APK 的方法(由于方法 dex 文件限制,我需要在调试时运行 proguard),即使它们在测试 apk 中使用。例如。我在单元测试中使用 GSON addProeprty 方法,但不在 App apk 中。此方法被剥离并导致测试失败。但是由于 dex 文件的限制,我不想将 proguard 配置为只保留所有 GSOn,也不想单独列出所有方法。有没有办法告诉 rpguard 将单元测试视为源代码入口点?

【问题讨论】:

    标签: android unit-testing proguard


    【解决方案1】:

    这就是我所做的。

    添加自定义的 proguard 规则文件。

    /project/app/proguard-test-rules.pro

    # Proguard rules that are applied to your test apk/code.
    -ignorewarnings
    
    -keepattributes *Annotation*
    
    -dontnote junit.framework.**
    -dontnote junit.runner.**
    
    -dontwarn android.test.**
    -dontwarn android.support.test.**
    -dontwarn org.junit.**
    -dontwarn org.hamcrest.**
    -dontwarn com.squareup.javawriter.JavaWriter
    # Uncomment this if you use Mockito
    #-dontwarn org.mockito.**
    

    将以下内容添加到您的应用程序的 build.gradle 中。测试时使用proguard文件。

    /project/app/build.gradle

    android {
        debug {
            minifyEnabled true
            testProguardFile 'proguard-test-rules.pro'
        }
    }
    

    【讨论】:

    • 你先生,真棒!
    • 我第一次尝试这个解决方案时错过了 testProguardFile 中的“测试”,谢谢!
    • 尝试使用 android 库。没有运气。 aar 被混淆了,但是 test apk 没有被混淆。
    • 检查共享该文件的google sample project
    【解决方案2】:

    以上答案都没有对我有用。我有两个问题:我还需要使用默认的 proguard 文件进行测试,而我的默认 proguard 文件是错误的。

    1. 要使用默认的 proguard 文件,除了你自己的:

      android {
          debug {
              minifyEnabled true
              testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project-test.pro'
          }
      }
      
    2. 当您通过 Android Studio 更新 SDK 工具时,默认的 proguard 文件(以及所有 tools/proguard 文件夹)显然是 not replaced by default。我的机器使用了一个过时的配置文件,这导致了奇怪的 proguard 问题。要更新 proguard 的默认配置,请将 ~/Library/Android/Sdk/tools/proguard/proguard-android.txt 替换为 this

    【讨论】:

    • 刚刚解决了第二个问题。我认为值得一提的是,从 2.2.0 版的 gradle android 插件开始,proguard-android.txt 不再使用,而是在构建时生成默认规则。来源:Android plugin for Gradle, revision 2.2.0
    【解决方案3】:

    仪器测试(和其他?)不使用与您的调试/发布 apk 相同的 proguard 文件。您可以尝试在调试和发布块中设置testProguardFile 选项。这个特定于测试的 proguard 文件可能非常宽松,因为它不用于调试/发布 apk。

    【讨论】:

      【解决方案4】:

      我已经在我的构建中解决了这个问题,方法是添加一个额外的“dev”buildType,我在其中启用了 proguard,但将其配置为将所有代码保留在我自己的包中,以及一些碰巧使用的特定库类仅来自测试。我还在开发者buildType 中禁用了混淆功能,以便可以从 IDE 中对其进行调试。

      对于调试和发布版本,我使用“真正的”proguard 设置,包括混淆和优化。

      【讨论】:

      • 你能分享一个类似的proguard文件吗?
      • 谢谢,应该可以。但是,我们有几种风格和模块,并且为所有这些风格和模块设置另一种构建类型有点混乱。来自其他答案的自定义 proguard 规则有所帮助。
      猜你喜欢
      • 2017-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多