是什么导致Android Dalvik java.lang.VerifyError“出现错误?”;数组索引“的注册表类型无效?”;?
我最近将用于构建应用程序的Android构建工具从19.1.0升级到21.0.2。应用程序可以编译,但启动时出现以下错误:是什么导致Android Dalvik java.lang.VerifyError“出现错误?”;数组索引“的注册表类型无效?”;?,java,android,dalvik,Java,Android,Dalvik,我最近将用于构建应用程序的Android构建工具从19.1.0升级到21.0.2。应用程序可以编译,但启动时出现以下错误: net.i2p.android W/dalvikvm﹕ Invalid reg type for array index (1103759864) net.i2p.android W/dalvikvm﹕ VFY: rejected Lnet/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement;.multiply (Lnet/
net.i2p.android W/dalvikvm﹕ Invalid reg type for array index (1103759864)
net.i2p.android W/dalvikvm﹕ VFY: rejected Lnet/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement;.multiply (Lnet/i2p/crypto/eddsa/math/FieldElement;)Lnet/i2p/crypto/eddsa/math/FieldElement;
net.i2p.android W/dalvikvm﹕ VFY: rejecting opcode 0x44 at 0x001c
net.i2p.android W/dalvikvm﹕ VFY: rejected Lnet/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement;.multiply (Lnet/i2p/crypto/eddsa/math/FieldElement;)Lnet/i2p/crypto/eddsa/math/FieldElement;
net.i2p.android W/dalvikvm﹕ Verifier rejected class Lnet/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement;
net.i2p.android W/dalvikvm﹕ Exception Ljava/lang/VerifyError; thrown while initializing Lnet/i2p/crypto/eddsa/spec/EdDSANamedCurveTable;
net.i2p.android W/dalvikvm﹕ Exception Ljava/lang/VerifyError; thrown while initializing Lnet/i2p/crypto/SigType;
net.i2p.android W/dalvikvm﹕ Exception Ljava/lang/VerifyError; thrown while initializing Lnet/i2p/router/startup/CreateRouterInfoJob;
net.i2p.android W/dalvikvm﹕ threadid=12: thread exiting with uncaught exception (group=0x41caeda0)
net.i2p.android E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-6713
Process: net.i2p.android, PID: 26198
java.lang.VerifyError: net/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement
at net.i2p.crypto.eddsa.math.ed25519.Ed25519LittleEndianEncoding.decode(Ed25519LittleEndianEncoding.java:189)
at net.i2p.crypto.eddsa.math.Field.fromByteArray(Field.java:55)
at net.i2p.crypto.eddsa.math.Field.<init>(Field.java:39)
at net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable.<clinit>(EdDSANamedCurveTable.java:21)
at net.i2p.crypto.SigType.<clinit>(SigType.java:51)
at net.i2p.router.startup.CreateRouterInfoJob.<clinit>(CreateRouterInfoJob.java:54)
at net.i2p.router.KeyManager$SynchronizeKeysJob.syncKeys(KeyManager.java:156)
at net.i2p.router.KeyManager$SynchronizeKeysJob.runJob(KeyManager.java:146)
at net.i2p.router.KeyManager.startup(KeyManager.java:65)
at net.i2p.router.Router.runRouter(Router.java:468)
at net.i2p.router.Router.main(Router.java:1158)
at net.i2p.router.RouterLaunch.main(RouterLaunch.java:21)
at net.i2p.android.router.service.RouterService$Starter.run(RouterService.java:320)
at java.lang.Thread.run(Thread.java:841)
net.i2p.android W/dalvikvm﹕ 数组索引的注册表类型无效(1103759864)
net.i2p.android W/dalvikvm﹕ VFY:拒绝Lnet/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement;。乘法(Lnet/i2p/crypto/eddsa/math/FieldElement;)Lnet/i2p/crypto/eddsa/math/FieldElement;
net.i2p.android W/dalvikvm﹕ VFY:在0x001c处拒绝操作码0x44
net.i2p.android W/dalvikvm﹕ VFY:拒绝Lnet/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement;。乘法(Lnet/i2p/crypto/eddsa/math/FieldElement;)Lnet/i2p/crypto/eddsa/math/FieldElement;
net.i2p.android W/dalvikvm﹕ 验证器拒绝Lnet/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement类;
net.i2p.android W/dalvikvm﹕ 异常Ljava/lang/VerifyError;初始化Lnet/i2p/crypto/eddsa/spec/EdDSANamedCurveTable时抛出;
net.i2p.android W/dalvikvm﹕ 异常Ljava/lang/VerifyError;初始化Lnet/i2p/crypto/SigType时抛出;
net.i2p.android W/dalvikvm﹕ 异常Ljava/lang/VerifyError;初始化Lnet/i2p/router/startup/CreateRouterInfoJob时抛出;
net.i2p.android W/dalvikvm﹕ threadid=12:线程以未捕获异常退出(组=0x41caeda0)
net.i2p.android E/AndroidRuntime﹕ 致命异常:Thread-6713
进程:net.i2p.android,PID:26198
java.lang.VerifyError:net/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement
net.i2p.crypto.eddsa.math.ed25519.Ed25519LittleEndianEncoding.decode(Ed25519LittleEndianEncoding.java:189)
net.i2p.crypto.eddsa.math.Field.fromByteArray(Field.java:55)
net.i2p.crypto.eddsa.math.Field.(Field.java:39)
net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable.(EdDSANamedCurveTable.java:21)
在net.i2p.crypto.SigType。(SigType.java:51)
在net.i2p.router.startup.CreateRouterInfoJob.(CreateRouterInfoJob.java:54)
net.i2p.router.KeyManager$SynchronizeKeysJob.syncKeys(KeyManager.java:156)
net.i2p.router.KeyManager$SynchronizeKeysJob.runJob(KeyManager.java:146)
net.i2p.router.KeyManager.startup(KeyManager.java:65)
在net.i2p.router.router.runRouter(router.java:468)
在net.i2p.router.router.main(router.java:1158)
位于net.i2p.router.RouterLaunch.main(RouterLaunch.java:21)
位于net.i2p.android.router.service.RouterService$Starter.run(RouterService.java:320)
运行(Thread.java:841)
我正在同一台设备上运行应用程序,并且没有更改任何代码。为什么Dalvik现在拒绝这个课程?我已在线搜索,但未找到有关数组索引的错误无效注册表类型的任何信息
被拒绝类的源代码是。我找不到导致问题出现的构建工具中的具体更改,但在查看之后,我发现了错误
Dalvik拒绝,因为它包含155个局部变量。该方法直接从相应的C代码移植而来,不能很好地转换为Java字节码。似乎在19.1.0和21.0++之间,构建工具中的编译器发生了改变,从而阻止了Dalvik处理如此多的局部变量
上的最后一篇文章提供了一些额外的见解:
是的,Dalvik编译器试图为每个
方法中的局部变量。它应该能够处理那么多,
但显然不能。通过使它们成为您删除的实例变量
编译器需要/希望“管理”它们(以及创建方法
相当小的数量)
我的解决方案是删除二十个不必要的变量(像g0=g[0]
这样的无操作赋值),而直接使用数组。这确实增加了将来bug潜入代码的可能性(如果其中一个数组索引被意外更改),但将局部变量的数量减少到135,这解决了运行时类拒绝的问题
“正确”的解决方案是完全重构该方法以减少其长度。这必须小心进行,以避免