有人可以在运行我的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
Run Code Online (Sandbox Code Playgroud)
该应用程序似乎运行正常,但我需要了解这个问题,因为我们有更复杂的应用程序,类似的错误导致dalvikvm崩溃.
问题似乎是该类MiscDatabaseModuleDaoImpl尝试访问该AbstractDatabaseModuleDao.logger字段,但由于访问限制(即私有、受保护等)而无法访问该字段。在这种情况下,访问该字段的 sget-object 操作码(操作码 0x62)被替换为引发验证异常的操作码,如果执行该操作码,可能会导致运行时崩溃。
此外,最后一条消息引用了MiscDatabaseModuleDaoImpl.getSequenceNextVal方法中的死代码。这是无害的 - 它不会在运行时引起任何问题。然而,找出死代码到底是什么并将其删除并不是一个坏主意。您可以使用 baksmali 和 --code-offsets 选项反汇编您的应用程序,然后查看该方法的反汇编结果。--code-offsets 选项将在包含偏移量的每条指令之前添加注释。根据错误消息,从 0x46 到 0x6e 的偏移量是死代码。.line附近还应该有指令,它们将是原始 java 文件中相应的行号。
| 归档时间: |
|
| 查看次数: |
4830 次 |
| 最近记录: |