我在测试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文件,因为我在proguard-test.cfg
中设置了-dontobfuscate
。
有人能看出我在这里做错了什么吗?
提前感谢!
编辑:所以,我从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
Proguard和NewRelic在没有特殊的NR例外情况下并不总是玩得很好。确保这些都在你的相关proguard配置中。
-keep class com.newrelic.** { *; }
-dontwarn com.newrelic.**
-keepattributes Exceptions, Signature, InnerClasses