如何修复 android 多个 dex 文件定义异常

How to fix android Multiple dex files define exception

Android 4.2 ZBarCodescan java 应用程序需要在 Windows 7 x64 计算机上编译。

它的源码是located here.

Android Studio 已安装,并使用 Github 导入命令导入代码。 在 gradle 文件中 API 已更改为 23

compileSdkVersion 23 

根据

Android studio Build APK 命令产生异常

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:579)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:535)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:517)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:164)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)

尝试通过添加行来解决此问题

dexOptions {
    preDexLibraries = false
}

根据

投射gradle行

Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat

导致错误

Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoIcsImpl;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoJellyBeanMr2;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoStubImpl;

如何解决这个问题?

Answer here 建议检查依赖树。如何在 Android Studio 中获取这棵树以及如何修复它?

删除android-支持-v4.jar异常后

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:579)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:535)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:517)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:164)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)

仍然发生。

更新。我尝试使用 https://github.com/cricket007/DeviceSDK/tree/fixes 导入修复分支 url 但测试按钮和导入产生错误

如何导入这个分支?

当我遇到同样的错误时,我不得不在 build.gradle 文件中注释掉以下行:

编译文件树(目录:'libs',包括:'*.jar')

UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;

发生这种情况是因为您添加了两次相同的内容 class。

在您的情况下,您使用的是:

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

appcompat-v7support-v4 有依赖关系。
您的 libs 文件夹中有 android-support-v4.jar

删除 android-support-v4.jar(您不需要它,因为 appcompat 已经有了)。

在 Android Studio 中运行后,我对库进行了 pull request

如果您在尝试构建时遇到此错误

SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.

或者您没有看到,但是在执行导入时缺少 local.properties 的任何错误,然后添加指向您的 Android SDK 位置的 local.properties 文件,然后尝试 import/rebuild.

例如在 Mac 上,该文件将包含这一行,但显然更改文件路径以指向您各自 SDK 的位置

sdk.dir=/usr/local/opt/android-sdk

完成后,它应该可以毫无问题地加载到 Android Studio 中。

该代码还在 4.2 模拟器上进行了测试。


通过 Git 终端的简单方法(可以用 Git 桌面做同样的事情)。

git clone https://github.com/cricket007/DeviceSDK /path/to/download/
cd /path/to/download/
git branch fixes

然后将 /path/to/download/DeviceSDK 作为导入项目导入 Android Studio Gradle


漫漫长路(来自 Android Studio)

Use https://github.com/cricket007/DeviceSDK.git as the Git repo

Open Project, you can ignore most errors that popup

Go the the Menu Bar, select VCS > Enable Version Control Integration

Choose Git

Go back to VCS > Git > Branches

Checkout fixes as a new local branch

Name the branch.

Choose Force Checkout if prompted

I don't know what clicking the Run button does with a Gradle project, but you should open Gradle View on the right side and open TestDemo, select installDebug

从这里开始,您需要上述 local.properties 文件的解决方案,并在物理设备上启用 ADB 调试或在模拟器上进行测试。