在我的测试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.txt
和dump.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
答案 0 :(得分:3)
Proguard和NewRelic并不总是很好,没有针对NR的特殊例外。 确保这些都在您的相关proguard配置中。
-keep class com.newrelic.** { *; }
-dontwarn com.newrelic.**
-keepattributes Exceptions, Signature, InnerClasses