java - Android dex 问题 : nested class + final boolean : com. android.dex.util.ExceptionWithContext

标签 java android maven dex

我正在尝试构建我的 Android 项目,但我在构建步骤中遇到了这个问题:

[INFO] UNEXPECTED TOP-LEVEL EXCEPTION:
[INFO] com.android.dex.util.ExceptionWithContext
[INFO]  at com.android.dex.util.ExceptionWithContext.withContext(ExceptionWithContext.java:45)
[INFO]  at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:369)
[INFO]  at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:137)
[INFO]  at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:93)
[INFO]  at com.android.dx.command.dexer.Main.processClass(Main.java:729)
[INFO]  at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
[INFO]  at com.android.dx.command.dexer.Main.access$300(Main.java:82)
[INFO]  at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:170)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:229)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:158)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:229)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:158)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:229)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:158)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:229)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:158)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
[INFO]  at com.android.dx.command.dexer.Main.processOne(Main.java:632)
[INFO]  at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)
[INFO]  at com.android.dx.command.dexer.Main.runMonoDex(Main.java:279)
[INFO]  at com.android.dx.command.dexer.Main.run(Main.java:245)
[INFO]  at com.android.dx.command.dexer.Main.main(Main.java:214)
[INFO]  at com.android.dx.command.Main.main(Main.java:106)
[INFO] Caused by: java.lang.NullPointerException
[INFO]  at com.android.dx.cf.code.ConcreteMethod.<init>(ConcreteMethod.java:87)
[INFO]  at com.android.dx.cf.code.ConcreteMethod.<init>(ConcreteMethod.java:75)
[INFO]  at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:271)
[INFO]  ... 22 more
[INFO] ...while processing <init> (Lcom/glureau/dex_issue/MyClass;)V
[INFO] ...while processing com/glureau/dex_issue/MyClass$1.class

看起来它与嵌套类 + 值始终为 false 的 if 条件有关:

public class MyClass {

    public static final boolean DEBUG   = false;

    private class NestedClass {
    }

    public void updateButton(Button button) {
        new NestedClass();
        if (DEBUG) {
            if (button != null) {
                button.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(v.getContext(), "Test", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }
    }
}

我怀疑这是一个 dex 问题,因为新的 OnClickListener 创建了一个引用 MyClass 实例的新 NestedClass,但同时,这部分代码在构建阶段被删除(因为 DEBUG=false)。

如果有人可以确认问题或对此添加一些解释,谢谢。

Apache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-14T18:37:52+01:00) Maven 主页:C:\apache-maven-3.2.1\bin.. Java 版本:1.7.0_71,供应商:Oracle Corporation Java 主目录:C:\Program Files\Java\jdk1.7.0_71\jre 默认语言环境:fr_FR,平台编码:Cp1252 操作系统名称:“windows 7”,版本:“6.1”,arch:“amd64”,系列:“windows”

完整的 Maven 项目(2 个类): http://www.filedropper.com/dexissue_1

PS:是的,我可以轻松更改代码以使其再次编译。例如,只需将新的 OnClickListener 移到 if 之外,但我很想了解为什么我的代码在 dex 过程中崩溃。

最佳答案

我可以确认这是 Android 构建工具链中某处的错误。在标准的 Android Studio 安装中,创建一个新项目并添加一个类(例如您的类)会导致崩溃。

我创建了一个 issue在 Android 开源项目中。

关于java - Android dex 问题 : nested class + final boolean : com. android.dex.util.ExceptionWithContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27825516/

相关文章:

android - 以编程方式在 Android 中配置第 3 方电子邮件帐户

java - Maven 未将依赖项复制到 Eclipse 中的 WEB-INF/lib

java - 将 spring-data-rest 添加到 gs-rest-service 示例项目后出现依赖问题

java - GSON 将 json 字符串转换为对象;获取空值和 0

java - 如何在项目中添加log4j(用于consol)(使用hibernate和spring)

java - 将数据从互联网加载到 ListView 的最合适方法

maven - Sonar 跳过除根模块之外的所有模块

java - 冰脸旋转监听器?

java - 菜单按钮不起作用

android - 以编程方式将 View 添加到 Fragment onCreateView 方法