尝试从Eclipse到Android Studio执行Android应用程序时出现异常

6
我曾尝试将Eclipse Android项目迁移到Android Studio,有两种方法:一是直接从Android Studio打开,二是先在Eclipse中迁移到Gradle,然后再在Android Studio中打开。接着,我尝试删除Google Play库文件夹,并在Gradle文件中添加它,此后项目会执行以下操作:

- 构建项目 OK
- 清理项目 OK
- 重建项目 OK
- Gradle同步并下载许多DLL文件 OK
- 但是播放或调试 KO 并且出现以下错误:

错误:执行任务失败 ':goSmart.guestperience.MoncloaDeSanLazaro:dexDebug'。
com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2

或者
错误:执行任务 ':goSmart.guestperience.MoncloaDeSanLazaro:dexDebug' 失败。
com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: 进程 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' 以非零退出值2结束。

错误:执行任务 ':goSmart.guestperience.MoncloaDeSanLazaro:dexDebug' 失败。
com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: 进程 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java'' 以非零退出值2结束。
我从JDK 1.6开始,然后更新到1.7,再更新到1.8,看看是否是问题所在。
如果我不删除Google Play服务文件夹,项目就可以正常工作。
我正在使用MAC,如果这很重要。
如果这有助于解决问题,我在我的 Stack Overflow 项目中还遇到了this另一个问题。
这是我的项目结构:

enter image description here

以下是所有项目的build.grade文件

主要包装项目(guestperience 1.0.1 Moncloa De San Lazaro):

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.0'
    }
}

goSmart.guestperience.MoncloaDeSanLazaro(这是我的编程位置):

apply plugin: 'com.android.application'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':librarySmartHotel')
    compile 'com.google.android.gms:play-services:7.3.0'
}

android {
    compileSdkVersion 16
    buildToolsVersion "22.0.1"

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

librarySmartHotel:

apply plugin: 'com.android.library'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':main')
}

android {
    compileSdkVersion 16
    buildToolsVersion '22.0.1'

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

主函数:
apply plugin: 'com.android.library'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}

android {
    compileSdkVersion 16
    buildToolsVersion '22.0.1'

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

我认为可能缺少一些配置,事实上我非常迷失。
我是一名iOS程序员,这是我在Android的第一步,项目是由另一个人完成的,现在我应该继续,所以我正在与Android Studio进行激烈的战斗,看起来我正在输;-P
感谢您的帮助。
更新:
我在日志中找到了这个:
AGPBI: {"kind":"SIMPLE","text":"UNEXPECTED TOP-LEVEL EXCEPTION:","position":{},"original":"意外的顶层异常:"} AGPBI: {"kind":"SIMPLE","text":"com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/analytics/internal/Command$1;","position":{},"original":"com.android.dex.DexException: 多个dex文件定义了Lcom/google/android/gms/analytics/internal/Command$1;"} AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)","position":{},"original":"\tat com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)"} AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)","position":{},"original":"\tat com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)"} AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)","position":{},"original":"\tat com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)"} AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)","position":{},"original":"\tat com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)"} AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.DexMerger.merge(DexMerger.java:189)","position":{},"original":"\tat com.android.dx.merge.DexMerger.merge(DexMerger.java:189)"} AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)","position":{},"original":"\tat com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)"} AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)","position":{},"original":"\tat com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)"} AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.command.dexer.Main.run(Main.java:246)","position":{},"original":"\tat com.android.dx.command.dexer.Main.run(Main.java:246)"} AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.command.dexer.Main.main(Main.java:215)","position":{},"original":"\tat com.android.dx.command.dexer.Main.main(Main.java:215)"} AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.command.Main.main(Main.java:106)","position":{},"original":"\tat com.android.dx.command.Main.main(Main.java:106)"}

尝试取消勾选“设置->编译器->使用进程内构建”框,然后清除缓存并重新启动IDE。 - Eenvincible
@Eenvincible 谢谢,但那并没有解决这个 bug。 - Stornu2
可能存在重复依赖项:https://dev59.com/D4vda4cB1Zd3GeqPdsTh#32973987 - itzhar
4个回答

22

问题来自于 Android Play Services 7.3.0。

尝试:

dependencies {
    compile 'com.google.android.gms:play-services:6.5.87'
}

或者启用 multiDex:

defaultConfig {
    minSdkVersion 14
    targetSdkVersion 19
    versionCode 1
    versionName versionNameVar
    multiDexEnabled true
}

使用multiDex解决方法可以编译,但可能在应用程序启动时崩溃。


3
抱歉我的朋友,你是对的,问题在于我需要从libs文件夹中删除旧的库。 - Stornu2
非常感谢!解决了我的问题! - Arda Ç.
它对我也起作用了。multiDex是什么?为什么应用程序启动时可能会崩溃? - FOMDeveloper
我不知道为什么它会在一些项目中崩溃,在我撰写这个答案时的日志并不是很清晰,但如果你尝试一下,没有崩溃,那就可以继续了,否则你需要更改 Play Services 的版本,也许 8.1.0 可以解决这个问题。 - Livio

4

经过数小时的探索,我找到了答案。

真正的问题在于您有多个具有相同类的库,因此解决方案是从其中一个库中删除重复的文件。

您必须删除具有重复文件的库或者:

  1. 使用WinRAR、7Zip或其他软件打开库libGoogleAnalyticsServices.jar
  2. 进入com/google/android/gms/analytics/internal并删除文件Command$1.classCommand.class

在您的情况下,您可能需要删除其他重复的文件,但不确定,因为您有许多文件。无论如何,如果上述方法不起作用,您还可以强制忽略其中一些文件。将以下代码放入build.gradle文件的Android块中:

defaultConfig {
    multiDexEnabled true
}

dexOptions {
    preDexLibraries = false
}

3
在我的情况下,我只需要删除旧的库。

1
尝试始终使用最新版本的Google Play进行编译。
尝试以下方法:compile 'com.google.android.gms:play-services:8.1.0' 来源:设置Google Play服务

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接