Android Studio意外的顶级例外:

时间:2015-06-22 11:53:18

标签: java android android-studio android-gradle android-sdk-tools

今天我面临一个巨大的错误,不允许我在手机上运行示例项目。

当Android Studio构建项目时,它首先会将以下目标显示为UP-TO-DATE

....
:demoproject:processDebugResources UP-TO-DATE
:demoproject:generateDebugSources UP-TO-DATE
:demoproject:compileDebugJava UP-TO-DATE
:demoproject:proguardDebug UP-TO-DATE
....

在构建过程中,有许多UP-TO-DATE个日志语句。但是,他们总是在:demoproject:dexDebug停止。对于dexDebug,我似乎永远不会得到UP-TO-DATE日志语句。

相反,dexDebug后面跟着此错误:

:demoproject:dexDebug
warning: Ignoring InnerClasses attribute for an anonymous inner class
(com.xyz.corp.sample.project.demo.a) that doesn't come with an
associated EnclosingMethod attribute. This class was probably produced by a
compiler that did not target the modern .class file format. The recommended
solution is to recompile the class from source, using an up-to-date compiler
and without specifying any "-target" type options. The consequence of ignoring
this warning is that reflective operations on this class will incorrectly
indicate that it is *not* an inner class.

现在有几十个Ignoring InnerClasses attribute错误。它们甚至出现在v4支持库中的类中,这确实令人困惑。

最后,这些错误以新的声明结束:

UNEXPECTED TOP-LEVEL EXCEPTION:
at com.android.dx.command.dexer.Main.access$300(Main.java:83)
at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
at com.android.dx.command.dexer.Main.main(Main.java:215)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)
at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
at com.android.dx.command.dexer.Main.run(Main.java:246)
at com.android.dx.command.dexer.Main.processOne(Main.java:632)
at com.android.dx.command.Main.main(Main.java:106)
...while parsing com/xyz/corp/sdk/AbcSDKConfig.class
1 error; aborting
Error:Execution failed for task ':demoproject:dexDebug'.
> com.android.ide.common.process.ProcessException:    org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_40\bin\java.exe'' finished with non-zero exit value 1
com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)
...while parsing com/xyz/corp/sdk/AbcSDKConfig.class
1 error; aborting
at com.android.dx.command.dexer.Main.processClass(Main.java:704)
at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)

我已经咨询过以下链接:

1。 Gradle finished with non-zero exit value 1

2。 What is the “Ignoring InnerClasses attribute” warning output during compilation?

我不确定它们适用于我的情况。我甚至无法运行项目。我已将IDE更新为SDK Tools 22.0.1并修改了buildToolsVersion文件中的build.gradle标记,但无济于事。有人可以指导我如何处理这个错误?所有帮助将不胜感激。

哦,这是我的build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion '22.0.1'

    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }

    defaultConfig {
        applicationId "com.xyz.corp.demo.project"
        minSdkVersion 10
        targetSdkVersion 22

        versionCode 2060200
        versionName '2.6.02.00'
    }

    buildTypes {
        debug {

            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def file = output.outputFile
                    output.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
                }
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.0'

    compile project(':xyzSDK')
}

帮助!!!

3 个答案:

答案 0 :(得分:2)

因为它报告:bad class file magic (cafebabe) or version (0034.0000)您应该检查是否正在使用您在运行时尝试使用的相同Java版本进行编译。 如果您使用的是gradle,则应在build.gradle文件中使用以下或类似的条目:

apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7

使用此link获取更多gradle详细信息。

在Android Studio中,File -> Project Structure -> SDK Location -> JDK Location应使用jdk 1.7而不是Project level设置中继。有关类似的Android Studio问题,请参阅此link

答案 1 :(得分:1)

UNEXPECTED TOP-LEVEL EXCEPTION表示您将被包含两次.jar

正如@Akhil所说,你应该排除support-v4因为我认为这是主要问题,但如果@Akhil回答没有帮助你试试这个方法。

compile (':xyzSDK') {
    exclude group: 'com.android.support', module: 'support-v4'
}

您是否尝试删除此行?

compile 'com.android.support:appcompat-v7:22.1.0'

也许:xyzSDK已经有appcompat-v7:22+ ..

我给你一个good answer by @CommonsWare来制作一个gradle报告,看看是什么问题。

我正在为你的答案而努力,所以如果我找到了一些有关的东西,我会更新我的答案。

完成此操作后,必须 Build -> Rebuild project

同样正如我在@dan上看到的那样......我告诉你可能answer

而不是1.7如丹所说,试着:

compileOptions {

    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

否则你可以手动检查File > Project Structure Ctrl + Alt + Shift + S 然后在JDK location看看你在使用什么,如果你使用1.8改变你的1.7 SDK路径

顺便说一下,我想我已经读过你曾经问过,如果我没有错的话,你是否可以使用JAVA 8代替JAVA 7 ......是的,你可以使用{ {1}},但前提是您还JDK 8使用了gradle-retrolamba,而且只有function description(data) { var entete = '<div id="content">'; entete += '<h1 id="firstHeading">' + data.website + '</h1>'; ... return entete; }

答案 2 :(得分:0)

您的 libs 文件夹&amp;库项目 xyzSDK 包含相同的库,这会在转换为dex时导致问题

您可以尝试识别此类库并将其从一个位置删除。 或者像这样排除

compile project(':xyzSDK'){
      exclude module: 'support-v4'
    }

我已经举了 support-v4 的例子,因为我之前遇到过类似的问题。