本机崩溃的随机测试失败
Random test failure with native crash
我 运行 espresso 测试套件针对我在模拟器上的应用程序。我看到以下 logcat 输出随机崩溃:
06-26 08:58:51.129 info WebViewFactory Loading com.android.webview version 44.0.2403.119 (code 246011960)
06-26 08:58:51.136 warn System ClassLoader referenced unknown path: /system/app/webview/lib/x86
06-26 08:58:51.139 info LibraryLoader Time to load native libraries: 1 ms (timestamps 9447-9448)
06-26 08:58:51.139 info LibraryLoader Expected native library version number "",actual native library version number ""
06-26 08:58:51.145 warn art Attempt to remove non-JNI local reference, dumping thread
06-26 08:58:51.145 warn art --------- beginning of crash
06-26 08:58:51.157 assert libc Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 23449 (myapp.com/...)
这些崩溃是针对大约 300 个测试用例的集合随机发生的。
附上我认为可能相关的 app build.gradle 文件部分。 (此外,在我将 gradle 从“2.1.2”迁移到“3.1.1”后,这些崩溃开始出现)。也添加了项目依赖项。
android {
compileSdkVersion 27
buildToolsVersion '27.0.3'
defaultConfig {
applicationId = BuildVars.applicationId
minSdkVersion 21
targetSdkVersion 23
versionCode minutesSinceEpoch()
versionName "${Version.packageVersion()}"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
}
sourceSets.main {
// use the jni .so compiled from the manual ndk-build command'''
jniLibs.srcDirs = ['src/main/jniLibs/debug/lib', 'src/main/jniLibs/release/lib']
jni.srcDirs = [] //disable automatic ndk-build call
}
...
}
task ndkBuildDebug(type: Exec) {
dependsOn swigBuild
dependsOn getAndroidNdk
dependsOn getAndroidAvd
def ndkDir = PropertiesFile.getValue(project.localProperties, "ndk.dir")
println "Your NDK appears to be in " + ndkDir
def numCompileThreads = numCompilationThreads()
println "Compiling with " + numCompileThreads + " threads "
commandLine Shell.getShellCommandLine("${ndkDir}/ndk-build -j ${numCompileThreads} -C src/main/jni NDK_DEBUG=1 " +
"NDK_OUT=../../../build/intermediates/ndk/debug/obj NDK_LIBS_OUT=../jniLibs/debug/lib"
)
}
spoon {
noAnimations = true
def envSerial = System.env['ANDROID_SERIAL'];
if (envSerial) {
devices = [envSerial];
}
if (project.hasProperty('spoonClassName')) {
className = project.spoonClassName
}
if (project.hasProperty('spoonMethodName')) {
methodName = project.spoonMethodName
}
debug = true
adbTimeout = 10*60
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile("com.appX:appX-android:$serializableLibVersion") {
transitive = false
}
compile("com.appX:appX-primogenitor:$serializableLibVersion") {
transitive = false
}
compile("com.appX:appX-serialize-common:$serializableLibVersion") {
transitive = false
}
compile "com.android.support:support-v13:27.1.0"
compile "com.android.support:appcompat-v7:27.1.0"
compile 'com.android.support:recyclerview-v7:27.1.0'
compile 'com.android.support:cardview-v7:27.1.0'
compile 'com.android.support:design:27.1.0'
compile 'com.android.support:percent:27.1.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.google.android.gms:play-services-base:10.2.1'
compile 'com.google.android.gms:play-services-analytics:10.2.1'
compile 'com.google.android.gms:play-services-gcm:10.2.1'
compile 'com.jakewharton:butterknife:8.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.1.0'
compile 'com.jakewharton.timber:timber:3.1.0'
compile 'com.squareup:otto:1.3.8'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-jackson:2.0.0'
compile 'com.squareup.retrofit2:converter-scalars:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'com.fasterxml.jackson.core:jackson-databind:2.6.1'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.okhttp3:okhttp:3.8.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'
compile 'com.google.guava:guava:18.0'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
compile 'commons-lang:commons-lang:2.6'
compile 'org.slf4j:slf4j-api:1.7.13'
compile 'com.melnykov:floatingactionbutton:1.3.0'
compile 'net.danlew:android.joda:2.7.2'
compile 'uk.co.chrisjenx:calligraphy:2.1.0'
compile 'frankiesardo:icepick:3.2.0'
compile 'com.mikhaellopez:circularimageview:3.0.2'
api 'frankiesardo:icepick:3.2.0'
compileOnly 'frankiesardo:icepick-processor:3.2.0'
annotationProcessor 'frankiesardo:icepick-processor:3.2.0'
compile('com.crashlytics.sdk.android:crashlytics:2.5.1@aar') {
transitive = true;
}
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') {
exclude module: 'support-annotations'
}
androidTestCompile('com.android.support.test.espresso:espresso-idling-resource:2.2.2') {
exclude module: 'support-annotations'
}
androidTestCompile "com.squareup.spoon:spoon-client:2.0.0-SNAPSHOT" // For Spoon snapshot, until 2.0.0 is released
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
exclude group: 'com.android.support', module: 'support-v4'
exclude group: 'com.android.support', module: 'design'
exclude group: 'com.android.support', module: 'recyclerview-v7'
}
}
感谢您包括我的问题。
这可能无关紧要,但您应该使用 "implementation" 而不是 "compile",因为编译关键字已弃用。您也应该使用 "androidTestImplementation"。也许这些与 Gradle 3 有一些冲突?可能不会。不过,这可能值得一试。
尝试在 app:gradle
中添加这个
android {
...
testOptions {
unitTests.all {
// All the usual Gradle options.
jvmArgs('-ea', '-noverify')
}
unitTests {
returnDefaultValues = true
}
}
...
}
最后,尝试清理并重建您的项目。您也可以尝试手动删除 Android Studio 在编译时创建的文件夹,但如果您不知道自己在做什么,这可能会有一点风险。我的想法是,可能会有一些旧的、无用的东西与你现在拥有的东西发生冲突。
问题是 API 测试机器上的 23 Intel Atom x86 模拟器(这已经有一段时间了),当我用 API 23 Google [=14 替换它时=] x86 模拟器 "and" 将系统目录指向最新 SDK (27.1) 中的系统映像,到目前为止我还没有再看到该错误。
${SDK_DIR}/tools/emulator -no-boot-anim -sysdir /Users/jenkins/build_tools/android-sdk-27.1/system-images/android-23/google_apis/x86_64 -avd Nexus_9_API_23 > /dev/null 2>&1 &
我 运行 espresso 测试套件针对我在模拟器上的应用程序。我看到以下 logcat 输出随机崩溃:
06-26 08:58:51.129 info WebViewFactory Loading com.android.webview version 44.0.2403.119 (code 246011960)
06-26 08:58:51.136 warn System ClassLoader referenced unknown path: /system/app/webview/lib/x86
06-26 08:58:51.139 info LibraryLoader Time to load native libraries: 1 ms (timestamps 9447-9448)
06-26 08:58:51.139 info LibraryLoader Expected native library version number "",actual native library version number ""
06-26 08:58:51.145 warn art Attempt to remove non-JNI local reference, dumping thread
06-26 08:58:51.145 warn art --------- beginning of crash
06-26 08:58:51.157 assert libc Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 23449 (myapp.com/...)
这些崩溃是针对大约 300 个测试用例的集合随机发生的。 附上我认为可能相关的 app build.gradle 文件部分。 (此外,在我将 gradle 从“2.1.2”迁移到“3.1.1”后,这些崩溃开始出现)。也添加了项目依赖项。
android {
compileSdkVersion 27
buildToolsVersion '27.0.3'
defaultConfig {
applicationId = BuildVars.applicationId
minSdkVersion 21
targetSdkVersion 23
versionCode minutesSinceEpoch()
versionName "${Version.packageVersion()}"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
}
sourceSets.main {
// use the jni .so compiled from the manual ndk-build command'''
jniLibs.srcDirs = ['src/main/jniLibs/debug/lib', 'src/main/jniLibs/release/lib']
jni.srcDirs = [] //disable automatic ndk-build call
}
...
}
task ndkBuildDebug(type: Exec) {
dependsOn swigBuild
dependsOn getAndroidNdk
dependsOn getAndroidAvd
def ndkDir = PropertiesFile.getValue(project.localProperties, "ndk.dir")
println "Your NDK appears to be in " + ndkDir
def numCompileThreads = numCompilationThreads()
println "Compiling with " + numCompileThreads + " threads "
commandLine Shell.getShellCommandLine("${ndkDir}/ndk-build -j ${numCompileThreads} -C src/main/jni NDK_DEBUG=1 " +
"NDK_OUT=../../../build/intermediates/ndk/debug/obj NDK_LIBS_OUT=../jniLibs/debug/lib"
)
}
spoon {
noAnimations = true
def envSerial = System.env['ANDROID_SERIAL'];
if (envSerial) {
devices = [envSerial];
}
if (project.hasProperty('spoonClassName')) {
className = project.spoonClassName
}
if (project.hasProperty('spoonMethodName')) {
methodName = project.spoonMethodName
}
debug = true
adbTimeout = 10*60
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile("com.appX:appX-android:$serializableLibVersion") {
transitive = false
}
compile("com.appX:appX-primogenitor:$serializableLibVersion") {
transitive = false
}
compile("com.appX:appX-serialize-common:$serializableLibVersion") {
transitive = false
}
compile "com.android.support:support-v13:27.1.0"
compile "com.android.support:appcompat-v7:27.1.0"
compile 'com.android.support:recyclerview-v7:27.1.0'
compile 'com.android.support:cardview-v7:27.1.0'
compile 'com.android.support:design:27.1.0'
compile 'com.android.support:percent:27.1.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.google.android.gms:play-services-base:10.2.1'
compile 'com.google.android.gms:play-services-analytics:10.2.1'
compile 'com.google.android.gms:play-services-gcm:10.2.1'
compile 'com.jakewharton:butterknife:8.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.1.0'
compile 'com.jakewharton.timber:timber:3.1.0'
compile 'com.squareup:otto:1.3.8'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-jackson:2.0.0'
compile 'com.squareup.retrofit2:converter-scalars:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'com.fasterxml.jackson.core:jackson-databind:2.6.1'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.okhttp3:okhttp:3.8.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'
compile 'com.google.guava:guava:18.0'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
compile 'commons-lang:commons-lang:2.6'
compile 'org.slf4j:slf4j-api:1.7.13'
compile 'com.melnykov:floatingactionbutton:1.3.0'
compile 'net.danlew:android.joda:2.7.2'
compile 'uk.co.chrisjenx:calligraphy:2.1.0'
compile 'frankiesardo:icepick:3.2.0'
compile 'com.mikhaellopez:circularimageview:3.0.2'
api 'frankiesardo:icepick:3.2.0'
compileOnly 'frankiesardo:icepick-processor:3.2.0'
annotationProcessor 'frankiesardo:icepick-processor:3.2.0'
compile('com.crashlytics.sdk.android:crashlytics:2.5.1@aar') {
transitive = true;
}
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') {
exclude module: 'support-annotations'
}
androidTestCompile('com.android.support.test.espresso:espresso-idling-resource:2.2.2') {
exclude module: 'support-annotations'
}
androidTestCompile "com.squareup.spoon:spoon-client:2.0.0-SNAPSHOT" // For Spoon snapshot, until 2.0.0 is released
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
exclude group: 'com.android.support', module: 'support-v4'
exclude group: 'com.android.support', module: 'design'
exclude group: 'com.android.support', module: 'recyclerview-v7'
}
}
感谢您包括我的问题。
这可能无关紧要,但您应该使用 "implementation" 而不是 "compile",因为编译关键字已弃用。您也应该使用 "androidTestImplementation"。也许这些与 Gradle 3 有一些冲突?可能不会。不过,这可能值得一试。
尝试在 app:gradle
中添加这个android { ... testOptions { unitTests.all { // All the usual Gradle options. jvmArgs('-ea', '-noverify') } unitTests { returnDefaultValues = true } } ... }
最后,尝试清理并重建您的项目。您也可以尝试手动删除 Android Studio 在编译时创建的文件夹,但如果您不知道自己在做什么,这可能会有一点风险。我的想法是,可能会有一些旧的、无用的东西与你现在拥有的东西发生冲突。
问题是 API 测试机器上的 23 Intel Atom x86 模拟器(这已经有一段时间了),当我用 API 23 Google [=14 替换它时=] x86 模拟器 "and" 将系统目录指向最新 SDK (27.1) 中的系统映像,到目前为止我还没有再看到该错误。
${SDK_DIR}/tools/emulator -no-boot-anim -sysdir /Users/jenkins/build_tools/android-sdk-27.1/system-images/android-23/google_apis/x86_64 -avd Nexus_9_API_23 > /dev/null 2>&1 &