java.lang.NoClassDefFoundError:未能解析:Lretrofit2/Reformation$Builder;
我正致力于在Android中编写非常简单的基于改型2的仪器化测试(ConnectedStatandroid任务) 但是,由于上述短错误消息,我的测试失败 下面是我正在使用的代码示例:java.lang.NoClassDefFoundError:未能解析:Lretrofit2/Reformation$Builder;,java,android,retrofit,retrofit2,dex,Java,Android,Retrofit,Retrofit2,Dex,我正致力于在Android中编写非常简单的基于改型2的仪器化测试(ConnectedStatandroid任务) 但是,由于上述短错误消息,我的测试失败 下面是我正在使用的代码示例: package com.example.app.android; import okhttp3.ResponseBody; import okhttp3.OkHttpClient; import java.util.concurrent.TimeUnit; import java.io.IOException;
package com.example.app.android;
import okhttp3.ResponseBody;
import okhttp3.OkHttpClient;
import java.util.concurrent.TimeUnit;
import java.io.IOException;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import android.util.Log;
public class Retrofit2Requests extends BasicRequest
{
private Call<ResponseBody> call;
private OkHttpClient _client;
private String _baseUrl;
private Retrofit2Adapter _adapter;
private static final String LOG_TAG = "RetroFit2Requests";
public Retrofit2Requests (String baseUrl) throws Exception
{
_client = new OkHttpClient
.Builder()
.connectTimeout(TIME_SOCKET_TIMEOUT, TimeUnit.MILLISECONDS)
.readTimeout(TIME_CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)
.build();
_adapter = (Retrofit2Adapter) new Retrofit.Builder()
.client(_client)
.baseUrl(baseUrl)
.build()
.create(Retrofit2Adapter.class);
_baseUrl = baseUrl;
}
public void getResponse(String data) throws IOException
{
Call<ResponseBody> call = _adapter.getDelayResponse(50, data);
call.enqueue(getCallback());
}
private Callback getCallback()
{
return new Callback<ResponseBody>()
{
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response)
{
ResponseBody responseBody = (ResponseBody) response.body();
Log.d(LOG_TAG, "ResponseBody: " + responseBody.toString());
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t)
{
Log.e(LOG_TAG, "An exception occured fetchign response...", t);
}
};
}
}
如果你好奇的话,是的,我正在对多个网络库做同样的事情。除非创建此版本,否则它们的存在不重要。以前,我也直接明确地依赖于OkHttp,但由于改型2依赖于它,我自然跳过了那个依赖
以下是我的android应用程序的defaultConfig:
defaultConfig {
applicationId 'com.example.app.android'
minSdkVersion 16
targetSdkVersion 24
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
dexOptions {
preDexLibraries true
javaMaxHeapSize '6g'
incremental true
}
}
通过对调试APK进行反编译,我可以看到Refundation2/Refundation.class不可用。这是令人困惑的,因为从我的理解来看,索引不应该影响它
有什么想法是这个问题的根源并在这种情况下解决吗?
NoClassDefFoundError
error意味着找不到类的定义。它与NoClassFoundException不同
:JVM可以找到该类,但无法成功加载它。(初始化该类时出错)NoClassDefFoundError
:JVM在类路径中找不到类NoClassFoundException
NoClassDefFoundError
总是在类初始化期间发生。我建议您清理项目并检查Lretrofit2/Reformation$Builder的初始过程
希望这篇文章能帮助你对于我的情况,我刚刚清理并重建了项目,这让我解决了这个问题。如果您更改了任何类名,但编译器仍将以前的类名保留在缓存中,并且在运行时编译器无法在您稍后更改名称时找到以前存储的类名,则会出现此异常。将此添加到应用程序的build.gradle中,在android{…}内:
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
然后清理并重建项目。这对我来说很有效。问题在改型2.8.1中得到了解决。如果改型依赖性低于2.8.1,请将其升级到2.8.1 来自改装: 版本2.8.1(2020-03-25) 修复:不访问MethodHandles。在Android API 24和25上查找。这门课只有一节课 可在Android API 26及更高版本上获得
非常感谢您的链接,我现在对问题本身有了更好的理解,但是我仍然得到了这个例外,尽管我删除了所有的构建目录和.gradle目录。注意:Refught2不是我的代码,而是用于REST服务交互的第三方。如果它像这样被打破,那将是令人惊讶的,特别是因为它实际上与他们记录为最佳实践/示例的内容是相同的。我建议您清理项目并调试这个类,以查看在初始化这个类的过程中发生了什么错误。
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}