转换为 Dalvik 格式异常:无效的 dex 字节码偏移量

问题描述 投票:0回答:4

尝试使用 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个小时的生命。请有人救救我。有人对此有任何线索吗?

android eclipse proguard dalvik dex
4个回答
3
投票

“locals invalid ... Conversion to Dalvik format failed with error 1”可能是 ProGuard 的优化步骤导致的,该步骤无法始终使局部变量的调试信息与代码上的优化保持一致。

  • 您可以通过不保留此调试信息来避免这种情况(不指定 -keepattributes LocalVariableTable)。
  • 您可以通过禁用优化来解决这个问题(将 -dontoptimize 添加到您的 proguard-project.txt 中)。
  • 您可以检查最新版本的 ProGuard 是否可以解决问题(将 android-sdk/tools/proguard/lib/proguard.jar 替换为 ProGuard 站点上的最新版本)。
  • 如果更新到最新版本的 ProGuard 没有帮助,您可以报告错误。

0
投票

我自己解决了。在 onActivityResult (抛出此错误的地方)的一个地方,我没有初始化 Integer 变量。通过初始化,问题就解决了。很奇怪。如果有人可以适当地解释这一点,我会推荐他/她的答案。

之前:

int x;

之后

int x = 0;

就是这样!


0
投票

我认为 Eclipse 在使用局部变量之前无法识别它的初始化。所以它在编写代码时不会向用户显示警告。但 adt 无法编译文件。 根据 TanDroiD 的说法,如果你初始化变量,你的问题就会得到解决。


0
投票

我遇到了类似的问题,解决方案是将

-keep class
放入引起类的 proguard 配置中。在我的情况下,它是 Fabric(Crashlytics 库)中的一个类

-keep class io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue  { *; }

© www.soinside.com 2019 - 2024. All rights reserved.