dalvik VM VFY代码的含义

时间:2012-04-17 16:45:05

标签: android dalvik

有人可以在运行我的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崩溃。

1 个答案:

答案 0 :(得分:4)

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

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