java 如何解决此错误 VFY:无法解析虚拟方法
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/36874821/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to resolve this error VFY: unable to resolve virtual method
提问by Dev Kim
I am using android studio 2.0 and in last time I upgrade jdk 7 to jdk 8 and I'm making some changes to file gradle but now I am getting this error
我正在使用 android studio 2.0,上次我将 jdk 7 升级到 jdk 8,我正在对文件 gradle 进行一些更改,但现在出现此错误
E/InstantRun: Could not find slices in APK; aborting.
I/dalvikvm: Could not find method android.content.Context.getSystemService, referenced from method com.mstr.malik.elbalaapps.ControlPanel.access$super
W/dalvikvm: VFY: unable to resolve virtual method 435: Landroid/content/Context;.getSystemService (Ljava/lang/Class;)Ljava/lang/Object;
D/dalvikvm: VFY: replacing opcode 0x6f at 0x004b
I/dalvikvm: Could not find method android.app.Activity.stopLockTask, referenced from method com.mstr.malik.elbalaapps.ControlPanel.access$super
W/dalvikvm: VFY: unable to resolve virtual method 231: Landroid/app/Activity;.stopLockTask ()V
D/dalvikvm: VFY: replacing opcode 0x6f at 0x00b9
E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.mstr.malik.elbalaapps.ControlPanel.access$super
W/dalvikvm: VFY: unable to resolve check-cast 224 (Landroid/os/PersistableBundle;) in Lcom/mstr/malik/elbalaapps/ControlPanel;
D/dalvikvm: VFY: replacing opcode 0x1f at 0x00f1
I/dalvikvm: Could not find method android.content.Context.getColorStateList, referenced from method com.mstr.malik.elbalaapps.ControlPanel.access$super
W/dalvikvm: VFY: unable to resolve virtual method 417: Landroid/content/Context;.getColorStateList (I)Landroid/content/res/ColorStateList;
D/dalvikvm: VFY: replacing opcode 0x6f at 0x0101
I/dalvikvm: Could not find method android.app.Activity.onVisibleBehindCanceled, referenced from method com.mstr.malik.elbalaapps.ControlPanel.access$super
W/dalvikvm: VFY: unable to resolve virtual method 154: Landroid/app/Activity;.onVisibleBehindCanceled ()V
D/dalvikvm: VFY: replacing opcode 0x6f at 0x0111
I/dalvikvm: Could not find method android.app.Activity.onWindowStartingActionMode, referenced from method com.mstr.malik.elbalaapps.ControlPanel.access$super
W/dalvikvm: VFY: unable to resolve virtual method 158: Landroid/app/Activity;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
D/dalvikvm: VFY: replacing opcode 0x6f at 0x0137
E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.mstr.malik.elbalaapps.ControlPanel.access$super
W/dalvikvm: VFY: unable to resolve check-cast 224 (Landroid/os/PersistableBundle;) in Lcom/mstr/malik/elbalaapps/ControlPanel;
D/dalvikvm: VFY: replacing opcode 0x1f at 0x019a
An this is gradle file
这是 gradle 文件
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "24.0.0 rc3"
defaultConfig {
applicationId "com.mstr.malik.elbalaapps"
minSdkVersion 18
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
}
How can I handle the error, I have tried to chanfe version of compile compile 'com.android.support:appcompat-v7:23.3.0' to compile 'com.android.support:appcompat-v7:23.0.0' It also crash, How can I do it? thanks in advance
我该如何处理该错误,我已经尝试将 compile compile 'com.android.support:appcompat-v7:23.3.0' 的 chanfe 版本编译为 'com.android.support:appcompat-v7:23.0.0' 它也崩溃,我该怎么办?提前致谢
回答by rekire
If you check in runtime the Android version you can safely ignore this warnings. It just means that you have a reference to a method which is not available on that platform where you code currently runs on. You just need to make sure that you don't use newer APIs on older platforms. Normally lint will warn you if you do something wrong in release builds. As long you keep that in mind you don't need to worry about it.
如果您在运行时检查 Android 版本,您可以安全地忽略此警告。这只是意味着您有一个方法的引用,该方法在您当前运行代码的平台上不可用。您只需要确保不在旧平台上使用新 API。如果您在发布版本中做错了什么,通常 lint 会警告您。只要你记住这一点,你就不必担心。
Just as an example for such an runtime switch:
仅作为此类运行时开关的示例:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// You can use here an API which was added in Lollipop.
}
回答by Zaicheng Qi
this is normal according to google Android engineers.
根据谷歌 Android 工程师的说法,这是正常的。
Refer to https://code.google.com/p/android/issues/detail?id=198567
参考https://code.google.com/p/android/issues/detail?id=198567
This happens when you compile against a higher api level than the deployed device api level. The logs are indicating that, some of the methods are not available and the virtual machine is going to replace them with the alternative implementation.
当您针对比部署的设备 api 级别更高的 api 级别进行编译时,就会发生这种情况。日志表明,某些方法不可用,虚拟机将用替代实现替换它们。
Br, Nick
兄弟,尼克
回答by zhen_khokh
I have the same warnings and then fatal NoClassDefFoundError. The issue can go from dex generated files in multi-dex mode of android-plugin. All classes that couldn't be found were in one package. The package was split between 2 dex-files. A solution is generating MainDexList file where I included only unresolved classes which were joined to one dex-file. For more details see also here.
我有同样的警告,然后是致命的 NoClassDefFoundError。该问题可能来自 android-plugin 的多 dex 模式下的 dex 生成文件。所有找不到的类都在一个包中。该包被分成 2 个 dex 文件。一种解决方案是生成 MainDexList 文件,其中我仅包含连接到一个 dex 文件的未解析类。有关更多详细信息,请参见此处。