2012-04-17 4 views
6

Kann jemand bitte die Bedeutung der folgenden Warnungen mir erklären, wenn meine Applikation für Android läuft (die Warnungen werden in der Reihenfolge ausgegeben, wie angegeben):Bedeutung von Dalvik VM VFY Codes

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 

Die Anwendung scheint gut zu laufen aber ich muss das Problem verstehen, da wir kompliziertere Anwendungen mit ähnlichen Fehlern haben, die den Dalvikvm zum Absturz bringen.

Antwort

4

Das Problem scheint zu sein, dass die Klasse MiscDatabaseModuleDaoImpl versucht, auf das Feld AbstractDatabaseModuleDao.logger zuzugreifen, aber aufgrund von Zugriffsbeschränkungen (d. H. Privat, geschützt usw.) nicht. In diesem Fall wird der sget-Objekt-Opcode (Opcode 0x62), der auf dieses Feld zugreift, durch einen ersetzt, der eine Überprüfungsausnahme auslöst, die bei Ausführung wahrscheinlich einen Laufzeitabsturz verursachen würde.

Zusätzlich bezieht sich die letzte Nachricht auf den toten Code in der MiscDatabaseModuleDaoImpl.getSequenceNextVal Methode. Dies ist harmlos - es wird während der Laufzeit keine Probleme verursachen. Es wäre jedoch keine schlechte Idee, genau herauszufinden, was der tote Code ist, und ihn zu entfernen. Sie können Ihre Anwendung mit baksmali zerlegen, mit der Option --code-offsets, und dann die Disassemblierung für diese Methode betrachten. Die Option --code-offsets fügt vor jeder Anweisung, die den Offset enthält, einen Kommentar ein. Laut der Fehlermeldung sind die Offsets von 0x46 bis 0x6e ein toter Code. Es sollte auch .line Direktiven in der Nähe geben, die die entsprechenden Zeilennummern aus der ursprünglichen Java-Datei sein werden.

+1

danke für die einsicht. Was es war ist ** AbstractDatabaseModuleDao ** hat eine private statische Protokollierung deklariert, diese abstrakte Klasse wurde jedoch auch von einer anderen abstrakten Klasse erweitert, die eine geschützte statische Protokollierung deklarierte. Der Dalvikvm mochte das nicht. Die andere Folge war ein Code in der ** getSequenceNextVal ** -Methode namens Logger. Jedoch ersetzt dalvikvm diesen Code und hat dazu geführt, dass er zu einem toten Code wurde (glaube ich). Durch einfaches Entfernen der statischen Logger-Deklaration wurden beide Probleme gelöst. Danke – paul

+0

Ah, ja. Das klingt richtig. Wenn der Opcode, der auf den Logger zugreift, durch einen ersetzt wurde, der einen VerificationError auslöst, wäre der unmittelbar folgende Code tot. – JesusFreke

+0

@JesusFreke, Das gleiche Problem, mich zu bekommen, verbinde ich dieses Problem, ich versuche seit den letzten 10 bis 15 Tagen, aber ich weiß nicht, wie zu lösen. Ich bekomme diese Art von Ausnahme = ("12-30 22: 40: 13.202: I/dalvikvm (400): Konnte die Methode com.anm.cms.core.util.AES128Bit.encrypt nicht finden, die von method com referenziert wurde. w2i.MainActivity.onCreate – tazeenmulani