当尝试使用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个小时的时间。请救救我吧。有人知道这方面的线索吗?
"local invalid…"转换为Dalvik格式失败,错误1"可能是ProGuard的优化步骤导致的,它不能总是保持关于局部变量的调试信息与代码的优化一致。
- 你可以通过不保留这个调试信息来避免它(不要指定-keepattributes LocalVariableTable)。 你可以通过禁用优化来解决这个问题(在你的proguard-project.txt中添加- dontopoptimize)。
- 您可以检查最新版本的ProGuard是否解决了问题(从ProGuard站点替换android-sdk/tools/ProGuard/lib/ProGuard .jar为最新版本)。
- 如果升级到最新版本的ProGuard没有帮助,你可以报告一个错误。
我自己解决了。在onActivityResult(这个错误被抛出)在一个地方,我没有初始化一个整数变量。通过初始化它,问题得到了解决。非常奇怪。如果有人能恰当地解释这个问题,我将推荐他/她的答案。
:
int x;
后int x = 0;
这是它!
我认为eclipse在使用它之前没有识别出初始化的局部变量。所以它不会在编写代码时向用户显示警告。但是编译文件失败。根据TanDroiD,如果你初始化变量,你的问题就会解决。
我有一个类似的问题,解决方案是将-keep class
放入proguard配置中以引起类。在我的情况下,它是Fabric (Crashlytics库)中的一个类
-keep class io.fabric.sdk.android.services.concurrency.DependencyPriorityBlockingQueue { *; }