尝试使用 Eclipse Juno 运行 ADT v21 代码时出现以下错误。
[2013-05-28 10:08:39 - XYZ] Dx
EXCEPTION FROM SIMULATION:
[2013-05-28 10:08:39 - XYZ] Dx local 000c: invalid
[2013-05-28 10:08:39 - XYZ] Dx ...at bytecode offset 00000c80
locals[0000]: Lcom/sec/x/y/z;
locals[0001]: I
locals[0002]: I
locals[0003]: Landroid/content/Intent;
locals[0004]: Ljava/lang/String;
locals[0005]: invalid
locals[0006]: Ljava/lang/String;
locals[0007]: invalid
locals[0008]: invalid
locals[0009]: invalid
locals[000a]: invalid
locals[000b]: Ljava/lang/String;
locals[000c]: invalid
locals[000d]: invalid
locals[000e]: invalid
locals[000f]: invalid
locals[0010]: invalid
locals[0011]: invalid
...while working on block 0c80
...while working on method onActivityResult IILandroid/content/Intent V
...while processing onActivityResult (IILandroid/content/Intent V
...while processing com/sec/x/y/z.class
[2013-05-28 10:09:05 - XYZ] Dx 1 error; aborting
[2013-05-28 10:09:05 - XYZ] Conversion to Dalvik format failed with error 1
该项目完美构建在 ADT v20 及更低版本上。但它始终给出与 ADT v21 相同的错误。该错误不会发生在构建阶段。当我尝试使用 Eclipse 运行应用程序时会发生这种情况。
我已经阅读了数千条与此相关的帖子。而且他们都没有工作。这肯定不是一个“清理/构建”问题。 对我来说,这似乎是 Eclipse 或 Proguard 的问题。我已经在这上面浪费了将近12个小时的生命。请有人救救我。有人对此有任何线索吗?
“locals invalid ... Conversion to Dalvik format failed with error 1”可能是 ProGuard 的优化步骤导致的,该步骤无法始终使局部变量的调试信息与代码上的优化保持一致。
我自己解决了。在 onActivityResult (抛出此错误的地方)的一个地方,我没有初始化 Integer 变量。通过初始化,问题就解决了。很奇怪。如果有人可以适当地解释这一点,我会推荐他/她的答案。
之前:
int x;
之后
int x = 0;
就是这样!
我认为 Eclipse 在使用局部变量之前无法识别它的初始化。所以它在编写代码时不会向用户显示警告。但 adt 无法编译文件。 根据 TanDroiD 的说法,如果你初始化变量,你的问题就会得到解决。
我遇到了类似的问题,解决方案是将
-keep class
放入引起类的 proguard 配置中。在我的情况下,它是 Fabric(Crashlytics 库)中的一个类
-keep class io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue { *; }