最近,我将用于构建应用程序的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)我正在同一设备上运行应用程序,没有更改任何代码。为什么Dalvik现在拒绝了这门课?我已经在网上搜索过了,但是没有发现任何关于错误Invalid reg type for array index的信息。
拒绝的类的源代码是这里。
发布于 2014-11-01 02:09:54
我无法在出现问题的构建工具中找到具体的更改,但是在查看了另一个Dalvik问题的答案之后,我发现了错误。
Dalvik拒绝Ed25519FieldElement.multiply(),因为它包含155个局部变量。该方法直接从相应的C代码移植而来,不能很好地转换成Java字节码。在19.1.0和21.0.+之间,编译工具中的编译器似乎发生了改变,从而阻止了Dalvik处理这许多局部变量。
关于此页的最后一篇文章提供了一些额外的见解:
是的,Dalvik编译器试图为方法中的每个局部变量分配一个“寄存器”。它应该能够处理那么多,但显然不能。通过使它们成为实例变量,您就消除了编译器“管理”它们的需求/愿望(并且使方法的数量更小)。
我的解决方案是删除20个不必要的变量(非操作赋值,如g0 = g[0]),而直接使用数组。这确实增加了将来出现错误的可能性(如果其中一个数组索引被意外更改),但是将局部变量的数量减少到135个,从而解决了运行时类的拒绝。
“正确”的解决方案是完全重构该方法,以减少其长度。为了避免引入侧通道攻击向量,必须谨慎地这样做。
https://stackoverflow.com/questions/26685636
复制相似问题