是什么导致Android Dalvik java.lang.VerifyError“出现错误?”;数组索引“的注册表类型无效?”;?

是什么导致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/

我最近将用于构建应用程序的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/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,这解决了运行时类拒绝的问题

“正确”的解决方案是完全重构该方法以减少其长度。这必须小心进行,以避免