“Proguard测试后没有找到测试”APK

时间:2015-08-11 19:21:12

标签: android unit-testing proguard

在我的测试APK上启用Proguard后,我遇到了一个奇怪的问题。在测试和测试的应用程序上启用了Proguard。 我正在使用Android Studio 1.2.11和Gradle 1.2.3

这是我的build.gradle:

buildTypes {
    // Development configuration.
    debug {
        debuggable true
        jniDebuggable true
        signingConfig signingConfigs.debug

        // Configure ProGuard
        minifyEnabled true

        // Default configuration
        proguardFile 'proguard/proguard.cfg'

        // Add all of our component-specific configurations (excluding the Android generic, as we want it to be last)
        FileTree tree =  fileTree(dir: 'proguard', include: '*.txt', exclude: 'Android.txt')
        tree.each {File file ->
            proguardFile file.getCanonicalPath()
        }

        // Android fallbacks
        proguardFile 'proguard/Android.txt'

        // Debug configuration
        proguardFile 'proguard/proguard-debug.cfg'

        // Test configuration
        testProguardFile 'proguard/proguard-test.cfg'
    }
}

这是proguard.cfg:

# Defaults from ProGuard
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Turn off optimization (as it can cause plenty of headaches)
-dontoptimize
-dontpreverify

proguard-debug.cfg(非常简单):

# Turn off obfuscation
-dontobfuscate

最后是proguard-test.cfg(也很简单):

# Turn off obfuscation
-dontobfuscate

# Unit tests
-dontwarn sun.reflect.**
-dontwarn org.junit.**
-dontwarn org.mockito.**
-dontwarn org.apache.tools.ant.**

其他Proguard配置用于我们使用的各种插件,实际上不应该有所作为。如果你有兴趣,我可以发布它们。

测试和测试的应用APK的构建工作正常。但是当测试APK安装并运行时,我得到“没有找到测试”。 我已经验证过如果我在非Proguard buildType上运行测试,测试运行正常。

此外,我还检查了Proguard输出中的seeds.txtdump.txt,并验证了测试代码确实存在于测试APK中。
此外,没有usage.txt(列出从APK中剥离的代码的文件),这意味着我的测试代码未被Proguard删除。还没有mapping.txt文件,因为我在-dontobfuscate中设置了proguard-test.cfg

谁能看到我在这里做错了什么?

提前致谢!

编辑:所以,我从logcat注意到错误是由某些ClassNotFoundExceptions引起的。例如:

java.lang.ClassNotFoundException: Didn't find class "com.newrelic.agent.android.instrumentation.okhttp2.ResponseBuilderExtension" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/wp.wpbeta.test-2/base.apk", zip file "/data/app/wp.wpbeta-2/base.apk"],nativeLibraryDirectories=[/data/app/wp.wpbeta-2/lib/arm, /vendor/lib, /system/lib]]

这很奇怪,因为这些类应该由我们的Proguard配置保存。事实上,如果我检查dump.txt,我发现它存在:

+ Program class: com/newrelic/agent/android/instrumentation/okhttp2/ResponseBuilderExtension
  Superclass:    com/squareup/okhttp/Response$Builder
  Major version: 0x32
  Minor version: 0x0
    = target 1.6
  Access flags:  0x21
    = public class com.newrelic.agent.android.instrumentation.okhttp2.ResponseBuilderExtension extends com.squareup.okhttp.Response$Builder

1 个答案:

答案 0 :(得分:3)

Proguard和NewRelic并不总是很好,没有针对NR的特殊例外。 确保这些都在您的相关proguard配置中。

-keep class com.newrelic.** { *; }
-dontwarn com.newrelic.**
-keepattributes Exceptions, Signature, InnerClasses