【问题标题】:meaning of dalvik VM VFY codesdalvik VM VFY 代码的含义
【发布时间】:2012-04-17 16:45:05
【问题描述】:

在运行我的Android应用程序时,有人可以向我解释以下警告的含义(警告按给定的顺序输出):

04-17 15:29:11.693: I/dalvikvm(4442): DexOpt: access denied from Lcom/kirona/iclient/db/core/services/impl/MiscDatabaseModuleDaoImpl; to field Lcom/kirona/iclient/database/common/impl/AbstractDatabaseModuleDao;.logger
04-17 15:29:11.653: W/dalvikvm(4442): VFY: unable to resolve static field 30 (logger) in Lcom/kirona/iclient/db/core/services/impl/MiscDatabaseModuleDaoImpl;
04-17 15:29:11.653: D/dalvikvm(4442): VFY: replacing opcode 0x62 at 0x0001    
04-17 15:29:11.693: D/dalvikvm(4442): VFY: dead code 0x0046-006e in Lcom/kirona/iclient/db/core/services/impl/MiscDatabaseModuleDaoImpl;.getSequenceNextVal (Ljava/lang/String;)J

该应用程序似乎运行良好,但我需要了解这个问题,因为我们有更复杂的应用程序具有类似的错误,导致 dalvikvm 崩溃。

【问题讨论】:

    标签: android dalvik


    【解决方案1】:

    问题似乎是 MiscDatabaseModuleDaoImpl 类试图访问 AbstractDatabaseModuleDao.logger 字段,但由于访问限制(即私有、受保护等)而无法访问。在这种情况下,正在访问该字段的 sget-object 操作码(操作码 0x62)被替换为引发验证异常的操作码,如果执行可能会导致运行时崩溃。

    此外,最后一条消息指的是MiscDatabaseModuleDaoImpl.getSequenceNextVal 方法中的死代码。这是无害的——它不会在运行时引起任何问题。但是,找出死代码是什么并删除它并不是一个坏主意。您可以使用带有 --code-offsets 选项的 baksmali 反汇编您的应用程序,然后查看该方法的反汇编。 --code-offsets 选项将在每条包含偏移量的指令之前添加注释。根据错误消息,从 0x46 到 0x6e 的偏移量是死代码。附近还应该有.line 指令,这将是原始java文件中的相应行号。

    【讨论】:

    • 感谢您的洞察力。 AbstractDatabaseModuleDao 声明了一个私有静态记录器,但是这个抽象类也从另一个声明了受保护静态记录器的抽象类扩展而来。 dalvikvm 不喜欢这样。另一个结果是 getSequenceNextVal 方法中的一些代码,称为记录器。然而 dalvikvm 替换了这段代码并导致它成为一个死代码(我认为)。只需删除静态记录器声明即可解决这两个问题。谢谢
    • 啊,是的。听起来不错。当访问记录器的操作码被替换为引发 VerificationError 的操作码时,紧随其后的代码将被编码为死。
    • @JesusFreke ,我遇到了同样的问题,我从过去 10 到 15 天开始尝试解决这个问题,但我不知道如何解决。我得到这种类型的异常 = ("12-30 22:40:13.202: I/dalvikvm(400): 找不到方法 com.anm.cms.core.util.AES128Bit.encrypt,引用自方法 com. w2i.MainActivity.onCreate
    • @JesusFreke,12-30 22:40:13.213: D/dalvikvm(400): VFY: 在 0x00a6 12-30 22:40:13.232 处替换操作码 0x77: D/dalvikvm(400): VFY:Lcom/w2i/MainActivity 中的死代码 0x00a9-00d7;.onCreate (Landroid/os/Bundle;)V 12-30 22:40:13.352: D/AndroidRuntime(400): 关闭 VM
    • @JesusFreke ,请你告诉我如何在 Android 中解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多