MultiDexTestRunner的哪个包? android.support.multidex或com.android.test.runner

时间:2015-01-20 22:10:15

标签: android multidex

页面http://developer.android.com/tools/building/multidex.html#testing 建议

   dependencies {
     compile 'com.android.support:multidex:1.0.1'
     androidTestCompile 'com.android.support:multidex-instrumentation:1.0.1'
   }
   android {
     defaultConfig {
        multiDexEnabled true
        testInstrumentationRunner "android.support.multidex.MultiDexTestRunner"
     }
  }

但是在运行测试时会产生ClassNotFoundException。

API文档和dexdump显示有com.android.test.runner.MultiDexTestRunner。

因此,如果我不相信文档而是指定

   dependencies {
     compile 'com.android.support:multidex:1.0.1'
     androidTestCompile 'com.android.support:multidex-instrumentation:1.0.1'
   }
  android {
     defaultConfig {
        multiDexEnabled true
        testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
     }
   }

然后我得到

com/company/myapp/MyApp; had used a different Landroid/support/multidex/MultiDexApplication; during pre-verification 
...
IllegalAccessExceptionIllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

我怀疑doc页面是错误的,正确的路径是com.android.test.runner.MultiDexTestRunner ...加上我还有其他一些问题。

请注意,multidex应用程序正常工作。不知何故,第二个MultiDexApplication包含在测试apk中。

问题:
MultiDexTestRunner的正确路径是哪条? 为什么我在测试apk中获得第二个MultiDexApplication?

3 个答案:

答案 0 :(得分:6)

更新:这是修复。这是一种常见模式,当您看到此类错误消息had used a different L<package>; during pre-verification时,您需要在运行测试时排除该包。

build.gradle

android {
    // ...
    defaultConfig {
        // ...
        multiDexEnabled true
        testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
    }
}

dependencies {
    // ...
    // Need to exclude this when running test
    androidTestCompile('com.android.support:multidex-instrumentation:1.0.1') {
        exclude group: 'com.android.support', module: 'multidex'
    }
}

Application.java

public class Application extends android.app.Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

答案 1 :(得分:1)

注意: 当您为multidex应用程序编写检测测试时,如果您使用MonitoringInstrumentation(或AndroidJUnitRunner)检测,则无需其他配置。

因此,请勿使用不推荐使用的MultiDexTestRunner;改为使用AndroidJUnitRunner。(这适用于multidex支持库v1.0.2 +)

android {
    // ...
    defaultConfig {
        // ...
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

仅当您拥有测试运行器引导程序的自定义实现时:

public void onCreate(Bundle arguments) {
  MultiDex.install(getTargetContext());
  super.onCreate(arguments);
  ...
}

请参阅:https://developer.android.com/studio/build/multidex.html#testing

答案 2 :(得分:0)

原始问题中描述的确切问题可能与旧版本有关。我在这里添加了我的经验,因为这是研究问题时谷歌的第一次点击。

使用最新版本的工具和Android插件,build.gradle中除此之外不需要任何其他内容:

...
android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
    }
}

(我有com.android.tools.build:gradle:1.5.0

编辑:正如@ igor-ganapolsky所指出的,MultiDexTestRunner is deprecated。 我无法访问其中出现的来源,但我怀疑当项目的整个测试设置需要大修时,MultiDexTestRunner会出现问题。

文档指向new Testing Support Library as the solution