代码之家  ›  专栏  ›  技术社区  ›  mesh

本机崩溃的随机测试失败

  •  7
  • mesh  · 技术社区  · 7 年前

    我正在Emulator上对我的应用程序运行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'
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   mesh    7 年前

    问题是测试机器上的API23 Intel Atom x86 Emulator(它可以追溯到很久以前),当我用API23 Google APIx86 Emulator替换它时,“在最新的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 &
    
        2
  •  0
  •   Luís Henriques    7 年前

    谢谢你把我的要求包括在内。

    1. 这可能无关紧要,但是应该使用“implementation”而不是“compile”,因为compile关键字已被弃用。你也应该使用“androidtestimplementation”。也许这会导致和3级的冲突?可能不是。不过,这可能值得一试。

    2. 尝试在内部应用程序中添加此内容:gradle

      android {
      
      ...
      
          testOptions {
              unitTests.all {
                  // All the usual Gradle options.
                  jvmArgs('-ea', '-noverify')
              }
              unitTests {
                  returnDefaultValues = true
              }
          }
      
      ...
      
      }
      
    3. 最后,试着清理和重建你的项目。你也可以尝试手动删除android studio在编译时创建的文件夹,但如果你不知道自己在做什么的话,这可能有点冒险。我的想法是,可能有一些旧的,无用的东西的记忆,导致与你现在的冲突。