I've got a warning in my logcat:
W/art: Verification of void com.myapp.LoginFragment$override.lambda$logIn$5(com.myapp.LoginFragment, java.lang.Throwable) took 217.578ms
Here's the code:
subscription = viewModel.logIn()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
this::showStudioSelection,
error -> {
ErrorResponse errorResponse = ErrorResponseFactory.create(error);
if (errorResponse.code() == ApiResult.BAD_REQUEST) {
Snackbar.make(getView(), R.string.login_bad_credentials, Snackbar.LENGTH_LONG)
.setAction(android.R.string.ok, v -> {})
.show();
} else {
Snackbar.make(getView(), "Unknown error " + errorResponse.code(), Snackbar.LENGTH_LONG)
.setAction(android.R.string.ok, v -> {})
.show();
}
viewModel.updateLoginButtonState();
}
);
220ms is quite a lot (and I feel like I'm noticing a lag on startup of that Fragment).
I'm using RxJava and retrolambda, but this is not the only spot where this message pops up so I don't think it's directly related.
How can I influence the verification time? Is it even worth it?
It seems like it has something to do with cyclomatic complexity, since I could get rid of the waring by removing the Snackbar.make
calls in the if
with some more dry code:
String errorMessage;
if (errorResponse.code() == ApiResult.BAD_REQUEST) {
errorMessage = getString(R.string.login_bad_credentials);
} else {
errorMessage = "Unknown error " + errorResponse.code();
}
It looks like this is part of the 'backwards compatibility' requirement for the newer ART
runtime. That is, apps built against DALVIK
need to be able to run on ART
as well.
If you run a DVM
app on an ART system, you'll see this message the first time it runs when dex2oat
converts the application. If you build the application targeting ART
, the app will no longer be able to run on DVM
, but the OAT
conversion will happen during installation and is not seen at runtime.
Source: The Art of Art note this is part one of a three part investigation of ART and you may need to check parts two and three