改造 2 出现 NoClassDefFoundError 错误
NoClassDefFoundError error with Retrofit 2
我有时会在编译和打开应用程序后收到此运行时错误。
这是我在 gradle 文件中的内容:
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'
compile 'com.squareup.okhttp3:okhttp:3.1.2'
compile 'com.google.code.gson:gson:2.6.1'
这里是 logcat 跟踪(实际错误仅在最后几行)
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: VFY: unable to find class referenced in signature (Lretrofit2/Response;)
04-27 17:54:37.442 29161-29161/com.myproject I/dalvikvm: Could not find method retrofit2.Response.body, referenced from method com.myproject.BaseController.hasOkStatus
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: VFY: unable to resolve virtual method 64810: Lretrofit2/Response;.body ()Ljava/lang/Object;
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: VFY: replacing opcode 0x6e at 0x0001
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: VFY: unable to find class referenced in signature (Lretrofit2/Response;)
04-27 17:54:37.442 29161-29161/com.myproject I/dalvikvm: Could not find method retrofit2.Response.isSuccess, referenced from method com.myproject.BaseController.parseResult
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: VFY: unable to resolve virtual method 64811: Lretrofit2/Response;.isSuccess ()Z
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: VFY: replacing opcode 0x6e at 0x0000
04-27 17:54:37.442 29161-29161/com.myproject I/dalvikvm: Failed resolving Lbr/org/myproject/rest/RestClient; interface 8642 'Lokhttp3/Interceptor;'
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: Link of class 'Lbr/org/myproject/rest/RestClient;' failed
04-27 17:54:37.442 29161-29161/com.myproject E/dalvikvm: Could not find class 'com.myproject.rest.RestClient', referenced from method com.myproject.rest.RestClient.getInstance
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: VFY: unable to resolve new-instance 2661 (Lbr/org/myproject/rest/RestClient;) in Lbr/org/myproject/rest/RestClient;
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: VFY: replacing opcode 0x22 at 0x0009
04-27 17:54:37.442 29161-29161/com.myproject I/dalvikvm: Failed resolving Lbr/org/myproject/rest/RestClient; interface 8642 'Lokhttp3/Interceptor;'
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: Link of class 'Lbr/org/myproject/rest/RestClient;' failed
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: DexOpt: unable to opt direct call 0x51d5 at 0x0b in Lbr/org/myproject/rest/RestClient;.getInstance
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: DexOpt: unable to opt direct call 0xeee1 at 0x10 in Lbr/org/myproject/rest/RestClient;.getInstance
04-27 17:54:37.442 29161-29161/com.myproject I/dalvikvm: DexOpt: unable to optimize static field ref 0x986d at 0x13 in Lbr/org/myproject/rest/RestClient;.getInstance
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: DexOpt: unable to opt direct call 0xee81 at 0x1a in Lbr/org/myproject/rest/RestClient;.getInstance
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: DexOpt: unable to opt direct call 0xfd2d at 0x3d in Lbr/org/myproject/rest/RestClient;.getInstance
04-27 17:54:37.442 29161-29161/com.myproject D/AndroidRuntime: Shutting down VM
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x416d5d58)
04-27 17:54:38.342 29161-29161/com.myproject E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myproject, PID: 29161
java.lang.NoClassDefFoundError: com.myproject.rest.RestClient
at com.myproject.rest.RestClient.getInstance(RestClient.java:29)
at com.myproject.features.auth.control.LoginController.<init>(LoginController.java:36)
[编辑] 这是有问题的代码:
public static Retrofit getInstance(){
if(instance != null) return instance;
Interceptor headerInterceptor = new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request originalRequest = chain.request();
MediaType mediaType = MediaType.parse("application/json");
return chain.proceed(originalRequest.newBuilder()
.header("Content-Type", mediaType.toString())
.addHeader("token", "asdfasdfadfafdadfa")
.build());
}
};
好的,看来这个错误的原因是我正在使用 multidex 支持,但我的自定义应用程序 class 没有扩展 MultiDexApplication.java,按照本页中的详细说明:
[http://developer.android.com/intl/pt-br/tools/building/multidex.html][1]
我有时会在编译和打开应用程序后收到此运行时错误。 这是我在 gradle 文件中的内容:
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'
compile 'com.squareup.okhttp3:okhttp:3.1.2'
compile 'com.google.code.gson:gson:2.6.1'
这里是 logcat 跟踪(实际错误仅在最后几行)
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: VFY: unable to find class referenced in signature (Lretrofit2/Response;)
04-27 17:54:37.442 29161-29161/com.myproject I/dalvikvm: Could not find method retrofit2.Response.body, referenced from method com.myproject.BaseController.hasOkStatus
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: VFY: unable to resolve virtual method 64810: Lretrofit2/Response;.body ()Ljava/lang/Object;
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: VFY: replacing opcode 0x6e at 0x0001
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: VFY: unable to find class referenced in signature (Lretrofit2/Response;)
04-27 17:54:37.442 29161-29161/com.myproject I/dalvikvm: Could not find method retrofit2.Response.isSuccess, referenced from method com.myproject.BaseController.parseResult
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: VFY: unable to resolve virtual method 64811: Lretrofit2/Response;.isSuccess ()Z
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: VFY: replacing opcode 0x6e at 0x0000
04-27 17:54:37.442 29161-29161/com.myproject I/dalvikvm: Failed resolving Lbr/org/myproject/rest/RestClient; interface 8642 'Lokhttp3/Interceptor;'
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: Link of class 'Lbr/org/myproject/rest/RestClient;' failed
04-27 17:54:37.442 29161-29161/com.myproject E/dalvikvm: Could not find class 'com.myproject.rest.RestClient', referenced from method com.myproject.rest.RestClient.getInstance
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: VFY: unable to resolve new-instance 2661 (Lbr/org/myproject/rest/RestClient;) in Lbr/org/myproject/rest/RestClient;
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: VFY: replacing opcode 0x22 at 0x0009
04-27 17:54:37.442 29161-29161/com.myproject I/dalvikvm: Failed resolving Lbr/org/myproject/rest/RestClient; interface 8642 'Lokhttp3/Interceptor;'
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: Link of class 'Lbr/org/myproject/rest/RestClient;' failed
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: DexOpt: unable to opt direct call 0x51d5 at 0x0b in Lbr/org/myproject/rest/RestClient;.getInstance
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: DexOpt: unable to opt direct call 0xeee1 at 0x10 in Lbr/org/myproject/rest/RestClient;.getInstance
04-27 17:54:37.442 29161-29161/com.myproject I/dalvikvm: DexOpt: unable to optimize static field ref 0x986d at 0x13 in Lbr/org/myproject/rest/RestClient;.getInstance
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: DexOpt: unable to opt direct call 0xee81 at 0x1a in Lbr/org/myproject/rest/RestClient;.getInstance
04-27 17:54:37.442 29161-29161/com.myproject D/dalvikvm: DexOpt: unable to opt direct call 0xfd2d at 0x3d in Lbr/org/myproject/rest/RestClient;.getInstance
04-27 17:54:37.442 29161-29161/com.myproject D/AndroidRuntime: Shutting down VM
04-27 17:54:37.442 29161-29161/com.myproject W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x416d5d58)
04-27 17:54:38.342 29161-29161/com.myproject E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myproject, PID: 29161
java.lang.NoClassDefFoundError: com.myproject.rest.RestClient
at com.myproject.rest.RestClient.getInstance(RestClient.java:29)
at com.myproject.features.auth.control.LoginController.<init>(LoginController.java:36)
[编辑] 这是有问题的代码:
public static Retrofit getInstance(){
if(instance != null) return instance;
Interceptor headerInterceptor = new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request originalRequest = chain.request();
MediaType mediaType = MediaType.parse("application/json");
return chain.proceed(originalRequest.newBuilder()
.header("Content-Type", mediaType.toString())
.addHeader("token", "asdfasdfadfafdadfa")
.build());
}
};
好的,看来这个错误的原因是我正在使用 multidex 支持,但我的自定义应用程序 class 没有扩展 MultiDexApplication.java,按照本页中的详细说明:
[http://developer.android.com/intl/pt-br/tools/building/multidex.html][1]