6

运行我的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 崩溃。

4

1 回答 1

4

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

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

于 2012-04-17T18:17:38.760 回答