Android: WireMock: com.android.dex.DexIndexOverflowException: 方法 ID 不在 [0, 0xffff] 中:65536
Android: WireMock: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
Gradle3.3,WireMock 2.6.0。
我通过 Gradle 构建我的 Android 项目。我用 Espresso、Mockito 编写单元测试,一切正常。
这是我的 build.gradle:
dependencies {
// for folder "androidTest"
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile "org.mockito:mockito-android:2.7.21"
androidTestCompile "org.powermock:powermock-api-mockito:1.6.6"
androidTestCompile 'org.powermock:powermock-module-junit4:1.6.6'
// for folder "test"
testCompile 'junit:junit:4.12'
testCompile 'org.powermock:powermock-api-mockito:1.6.6'
testCompile 'org.powermock:powermock-module-junit4:1.6.6'
}
我的项目构建成功,单元测试成功运行。好的。
现在我想添加 WireMock 单元测试。所以我改变了我的build.gradle(如博客所示:http://handstandsam.com/2016/01/30/running-wiremock-on-android/):
dependencies {
// for folder "androidTest"
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile "org.mockito:mockito-android:2.7.21"
androidTestCompile "org.powermock:powermock-api-mockito:1.6.6"
androidTestCompile 'org.powermock:powermock-module-junit4:1.6.6'
//WireMock
androidTestCompile("com.github.tomakehurst:wiremock:2.6.0") {
//Using Android Version Instead
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
//Version conflict with our app's slf4j version
exclude group: 'org.slf4j', module: 'slf4j-api'
//Was getting a classpath conflict for org.objectweb.asm.AnnotationVisitor which is a part of 'net.minidev:asm'
exclude group: 'org.ow2.asm', module: 'asm'
//Was getting this warning, so decided to ignore this version included by WireMock.
//Warning:Dependency org.json:json:20090211 is ignored as it may be conflicting with the internal version provided by Android.
//In case of problem, please repackage with jarjar to change the class packages
exclude group: 'org.json', module: 'json'
}
// for folder "test"
testCompile 'junit:junit:4.12'
testCompile 'org.powermock:powermock-api-mockito:1.6.6'
testCompile 'org.powermock:powermock-module-junit4:1.6.6'
}
当我 运行 我的应用程序一切正常。但是当我尝试为 Android 开始我的检测单元测试时,我得到了下一个错误:
:app:compileDevAndroidTestShaders
:app:generateDevAndroidTestAssets
:app:mergeDevAndroidTestAssets
:app:transformClassesWithDexForDevAndroidTest FAILED
FAILURE: Build failed with an exception.
What went wrong:
Execution failed for task ':app:transformClassesWithDexForDevAndroidTest'.
com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
当访问索引大于 64K(Dex 方法计数限制)的方法时,会发生 DexIndexOverFlowException。这意味着您的 android 项目中方法计数(引用)的实际数量大于 64K,并且您的应用程序的最终 .dex 文件将被拆分为多个 dex 文件。在这种情况下,您应该让您的应用程序支持 multidex,方法如下:
1- 添加 multidex 依赖项:
compile 'com.android.support:multidex:1.0.1'
2- 添加以下配置到 app/build.gradle :
android {
defaultConfig {
multidexEnabled true
}
}
3- 创建自定义应用程序 class 以扩展 MultiDexApplication
public MyApplication extends MultiDexApplication
4- 将此自定义 class 作为您应用程序的入口点,在 AndroidManifest.xml
:
<application
android:name=".MyApplication"
Gradle3.3,WireMock 2.6.0。 我通过 Gradle 构建我的 Android 项目。我用 Espresso、Mockito 编写单元测试,一切正常。
这是我的 build.gradle:
dependencies {
// for folder "androidTest"
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile "org.mockito:mockito-android:2.7.21"
androidTestCompile "org.powermock:powermock-api-mockito:1.6.6"
androidTestCompile 'org.powermock:powermock-module-junit4:1.6.6'
// for folder "test"
testCompile 'junit:junit:4.12'
testCompile 'org.powermock:powermock-api-mockito:1.6.6'
testCompile 'org.powermock:powermock-module-junit4:1.6.6'
}
我的项目构建成功,单元测试成功运行。好的。 现在我想添加 WireMock 单元测试。所以我改变了我的build.gradle(如博客所示:http://handstandsam.com/2016/01/30/running-wiremock-on-android/):
dependencies {
// for folder "androidTest"
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile "org.mockito:mockito-android:2.7.21"
androidTestCompile "org.powermock:powermock-api-mockito:1.6.6"
androidTestCompile 'org.powermock:powermock-module-junit4:1.6.6'
//WireMock
androidTestCompile("com.github.tomakehurst:wiremock:2.6.0") {
//Using Android Version Instead
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
//Version conflict with our app's slf4j version
exclude group: 'org.slf4j', module: 'slf4j-api'
//Was getting a classpath conflict for org.objectweb.asm.AnnotationVisitor which is a part of 'net.minidev:asm'
exclude group: 'org.ow2.asm', module: 'asm'
//Was getting this warning, so decided to ignore this version included by WireMock.
//Warning:Dependency org.json:json:20090211 is ignored as it may be conflicting with the internal version provided by Android.
//In case of problem, please repackage with jarjar to change the class packages
exclude group: 'org.json', module: 'json'
}
// for folder "test"
testCompile 'junit:junit:4.12'
testCompile 'org.powermock:powermock-api-mockito:1.6.6'
testCompile 'org.powermock:powermock-module-junit4:1.6.6'
}
当我 运行 我的应用程序一切正常。但是当我尝试为 Android 开始我的检测单元测试时,我得到了下一个错误:
:app:compileDevAndroidTestShaders
:app:generateDevAndroidTestAssets
:app:mergeDevAndroidTestAssets
:app:transformClassesWithDexForDevAndroidTest FAILED
FAILURE: Build failed with an exception.
What went wrong:
Execution failed for task ':app:transformClassesWithDexForDevAndroidTest'.
com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
当访问索引大于 64K(Dex 方法计数限制)的方法时,会发生 DexIndexOverFlowException。这意味着您的 android 项目中方法计数(引用)的实际数量大于 64K,并且您的应用程序的最终 .dex 文件将被拆分为多个 dex 文件。在这种情况下,您应该让您的应用程序支持 multidex,方法如下:
1- 添加 multidex 依赖项:
compile 'com.android.support:multidex:1.0.1'
2- 添加以下配置到 app/build.gradle :
android {
defaultConfig {
multidexEnabled true
}
}
3- 创建自定义应用程序 class 以扩展 MultiDexApplication
public MyApplication extends MultiDexApplication
4- 将此自定义 class 作为您应用程序的入口点,在 AndroidManifest.xml
:
<application
android:name=".MyApplication"