Android Studio-予期しないトップレベルの例外:


82

ツールの一部として提供されている新しいプロジェクトテンプレートを使用して、AndroidStudioで新しいプロジェクトをビルドしました。すべてのコードはStudioによって生成されており、まだ修正を加えていません。

コードを実行しようとしていますが、アプリが次のエラーで失敗します。問題が何であるかわからないので、助けていただければ幸いです。

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Landroid/support/v7/app/ActionBar$Callback;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
    at com.android.dx.command.dexer.Main.run(Main.java:230)
    at com.android.dx.command.dexer.Main.main(Main.java:199)
    at com.android.dx.command.Main.main(Main.java:103)

 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\RichardKavanagh\AppData\Local\Android\android-sdk\build-tools\19.0.1\dx.bat --dex --output D:\Android\Projects\MyHealthRecord\app\build\libs\app-debug.dex D:\Android\Projects\MyHealthRecord\app\build\classes\debug D:\Android\Projects\MyHealthRecord\app\build\dependency-cache\debug D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\android-support-v7-appcompat-5a78dab7e2789bbe64f4bc80d106ca75c04dcf6f.jar D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\classes-f9b947272e9f33ba50355b52d82755584f9c0c58.jar D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\support-v4-19.0.0-31a2c13df80d37d62ca50fec3bde6da0ca706223.jar
Error Code:
    2
Output:

    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Landroid/support/v7/app/ActionBar$Callback;
        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
        at com.android.dx.command.dexer.Main.run(Main.java:230)
        at com.android.dx.command.dexer.Main.main(Main.java:199)
        at com.android.dx.command.Main.main(Main.java:103)



* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 12.948 secs

build.gradleを投稿します。
Gabriele Mariotti 2014年

このソリューションを試してみてください、それは私のために働きました、私はpyus13が言ったことを試しましたが、これはうまくいきました。
Joshua G

これは、ライブラリに重複する依存関係がある場合にも発生する可能性があります。これを解決するには、stackoverflow.com
a / 30649660/1979347

tom

回答:


117

他のみんながここで言ったように、サポートライブラリ(com.android.support)はあなたのプロジェクトに複数回含まれています。これをbuild.gradleルートレベルで追加してみてください。サポートライブラリが他のプロジェクトの依存関係を介してエクスポートされないようにする必要があります。

configurations {
    all*.exclude group: 'com.android.support', module: 'support-v4'
}

このような依存関係に複数のサポートライブラリが含まれている場合は、そのうちの1つを削除することをお勧めします。ここに画像の説明を入力してください


1
これがまさにこの問題を修正したものです
andreimarinescu 2014

@iTapAndroid:どのbuild.gradleファイルに追加する必要がありますか?ModuleまたはProject(この行があります)にファイルしますclasspath 'com.android.tools.build:gradle:0.9.+'か?教えてください、これは修正できません。
ホイタワー2014

モジュールgradleファイルに追加する必要があります。これは、すべての依存関係を追加するファイルになります。
iTapAndroid 2014

@iTapAndroid Eclipseプロジェクトにbuild.gradleがない場合、これを解決するにはどうすればよいですか?
コンソールを

4
これは私にはうまくいきません私は同じ問題を抱えています。上記のコードを追加すると、android.support.v4.app.ActionBarDrawerToggleをインポートできません。
NathofGod 2014

18

ここに画像の説明を入力してください

dependencies {
    compile 'com.android.support:support-v4:19.1.+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

libsフォルダーにサポートjarがある場合、これは競合します。プロジェクトのlibsフォルダーにサポートjarがあり、コンパイルするためにモジュールの依存関係が追加されている場合、「com.android.support:support-v4:13.0。+」UNEXPECTED_TOPLEVEL_DEPENDANCY例外がスローされます。 競合するフォルダー構造とbuild.gradle


素晴らしい投稿、ありがとう。私のためにそれをしたのはcompile fileTree(dir: 'libs', include: ['*.jar'])あなたのスクリーンショットの部分でした。個々の依存関係をすべてコメントアウトしてプラグインすると、問題が修正されました。
user1003916 2014年

9

プロジェクトに2つの同じライブラリを含めることができるためです。build.gradleファイルを確認してください。

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile files('libs/android-support-v4.jar') 
 }

ファイルにコンパイル'com.android.support:appcompat-v7:+'とが含まれている場合、compile files('libs/android-support-v4.jar')この問題が発生します。この文を削除します:コンパイルファイル( 'libs / android-support-v4.jar')

それが私がこの問題を解決する方法です。


8

このエラーは、build.gradleの依存関係に同じライブラリ/ディレクトリが複数回含まれている場合に発生します。わかりました。次のようなアプリ構造があるとします。

ここに画像の説明を入力してください

つまり、メインの「アプリ」があり、次にサブアプリ/モジュール/ライブラリがたくさんあります。ライブラリは、1)gene_test_library、2)genes_nine_old_androids_library、および3)swipe_list_view_libraryです。

私の名前はジーンです。だからこそ、これらすべての「ジーン」ライブラリーがあります。

「アプリ」のbuild.gradle内には、次のものがあります。

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

    compile project(':libraries:gene_test_library')
    //compile project(':libraries:genes_nine_old_androids_library')
    compile project(':libraries:swipe_list_view_library')
}

gene_test_libraryのbuild.gradle内には、何もありません。

dependencies {
}

gene_nine_old_androids_libraryのbuild.gradle内に、次のものがあります。

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

swipe_list_view_libraryのbuild.gradle内には、次のものがあります。

dependencies {
    compile 'com.nineoldandroids:library:2.4.0+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.0'
}

このコード行「compilefileTree(dir: 'libs'、include:['* .jar'])」は、「ねえ、このモジュール内の 'libs'フォルダー内でjarファイルを探してください」という意味です。どのモジュールのlibsフォルダーにも何も入っていないので、そのコード行は無視してかまいません。

したがって、「app」モジュールのbuild.gradleで// compile project( ':libraries:genes_nine_old_androids_library')のコメントを解除するとします。次に、「予期しないトップレベルの例外:」エラーが発生します。何故ですか?

ここに画像の説明を入力してください

そうですね、「app」のbuild.gradle内に// compile project( ':libraries:genes_nine_old_androids_library')を書き込むことは、「genes_nine_old_androids_library」モジュールのビルド依存関係を取得してそこに配置することと同じです。したがって、// compile project( ':libraries:genes_nine_old_androids_library')ステートメントのコメントを解除すると、「app」モジュールのbuild.gradleは次のようになります。

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

    compile project(':libraries:gene_test_library')
    ***compile fileTree(dir: 'libs', include: ['*.jar'])***
    ***compile 'com.android.support:appcompat-v7:21.0.0'***
    compile project(':libraries:swipe_list_view_library')
}

「compile'c​​om.android.support:appcompat-v7:21.0.0 '」が2倍に表示されることに注目してください。それがエラーの原因です。


3
「同じライブラリ/ディレクトリが複数回含まれていると、エラーが発生します。」これは私の日を救った。
Subin Sebastian 2014

@ Gene、in appyou compile project(':libraries:swipe_list_view_library')、およびswipe_list_view_libraryにはappcompat-v7も含まれています。したがって、2つのappcompat-v7がでコンパイルされることになりappます。なぜこれはエラーをスローしないのですか?
azizbekian 2016年

ええと...私はこの数年前に書きました...それがスローするエラーは予期しないトップレベルの例外だと思います。
遺伝子

5

この問題の2つの理由が見つかりました:

  1. 複数のライブラリが含まれていることが原因の場合もあります。たとえば、

    'com.nineoldandroids:library:2.4.0'をコンパイルします

Gradleに追加し、Gradleで「nineoldandroids」を使用する別のライブラリを追加します。

  1. Android開発者の公式ウェブサイトは、言いました:

Androidアプリをビルドしてこのエラーを受け取った場合は、おめでとうございます。たくさんのコードがあります。

なぜ?

Dalvik Executable仕様では、Androidフレームワークメソッド、ライブラリメソッド、独自のコード内のメソッドを含め、単一のDEXファイル内で参照できるメソッドの総数が65,536に制限されています。この制限を超えるには、マルチデックス構成と呼ばれる複数のDEXファイルを生成するようにアプリビルドプロセスを構成する必要があります。

それならあなたは何をすべきですか?

  • 65Kの制限を回避する-どのように?

    1. アプリの直接および推移的な依存関係を確認します-アプリに含める大きなライブラリの依存関係が、アプリケーションに追加されるコードの量を上回る方法で使用されていることを確認します。一般的なアンチパターンは、いくつかのユーティリティメソッドが有用だったため、非常に大きなライブラリを含めることです。アプリコードの依存関係を減らすと、多くの場合、dex参照の制限を回避するのに役立ちます。
    2. ProGuardを使用して未使用のコードを削除する-アプリのProGuard設定を構成してProGuardを実行し、リリースビルドで縮小が有効になっていることを確認します。縮小を有効にすると、APKで未使用のコードを出荷しないようになります。
  • Gradleを使用したMultidex用のアプリの構成-どのように?1.Gradleビルド構成を変更してmultidexを有効にします。

置く

multiDexEnabled true

GradleビルドファイルのdefaultConfig、buildType、またはproductFlavorセクションにあります。

2.マニフェストで、multidexサポートライブラリからapplication要素にMultiDexApplicationクラスを追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
<application
    ...
    android:name="android.support.multidex.MultiDexApplication">
    ...
</application>
</manifest>

注:アプリがApplicationクラスの拡張を使用している場合は、attachBaseContext()メソッドをオーバーライドし、MultiDex.install(this)を呼び出してmultidexを有効にすることができます。詳細については、MultiDexApplicationリファレンスドキュメントを参照してください。


また、このコードはあなたを助けるかもしれません:

dexOptions {
    javaMaxHeapSize "4g"
}

あなたのgradle(android {...})を入れてください。


javaMaxHeapSizeを使用する理由は何ですか?
IgorGanapolsky 2017

4

こんにちはすべて私は解析を統合しようとしたときに含めた重複したサポートバージョン4ファイルによって引き起こされていた同じ問題を抱えていました。libsディレクトリから余分なインクルージョンを削除しました。これで正常に動作します。


Mavenリポジトリを使用して、依存関係ブロックから「compile'c​​om.android.support:appcompat-v7:23.0.1 '」と「compile'c​​om.android.support:support-v4:23. +'」の両方を削除する必要がありました。
マヤ2015年

3

これは、ライブラリが2回コンパイルされている場合(つまり、2回追加されている場合)に発生します。それはサポートライブラリまたは他のものである可能性があります、それは問題ではありません。
一般的なケースは、すでにlibs/ディレクトリにあるライブラリのコンパイルステートメントを追加した場合です。すべての*.jarファイルは自動的にコンパイルされます。したがって、コンパイルステートメントを追加するとエラーが発生します。そのステートメントを削除すると、この問題が修正される可能性があります。これが当てはまらない場合は、すでにいくつかの素晴らしい答えがあります。


3

これは最もばかげた答えかもしれませんが、これは私にとってはうまくいきました:

  • プロジェクトのすべてのライブラリを手動で削除して追加しました。(次々に)そして出来上がり、それは機能しました。
  • ビルド->プロジェクトの再構築

注:私のライブラリは2回コンパイルされていません。


2

build.gradleでサポートライブラリの依存関係を使用するには、サポートリポジトリをダウンロードしたことを確認してください。

ここに画像の説明を入力してください

これらがすべてインストールされている場合は、使用可能なボタンを使用して、プロジェクトをgradleと同期します。

同期ボタン


0

私の場合、プロジェクトパスに特別な文字があるため、TOP LEVELEXCEPTIONがスローされました。プロジェクトを閉じ、「á」を「a」に変更して、プロジェクトを再開しました。動作します!


0

突然、プロジェクトに大きな変更を加えることなく、私もこのエラーが発生しました。

サポートライブラリV4とV7の両方が必要だったため、上記のすべてが機能しませんでした。

最後に、2時間前にプロジェクトが問題なくコンパイルされたため、Android Studioにプロジェクトを再構築するように指示しただけで、エラーはなくなりました。


0

アプリの署名付きapkを作成しようとしたときに、同様の問題が発生しました。

奇妙なことに、それは私がリリースapkをビルドしたいときにのみ起こりましたが、デバッグapkではすべてが正常に機能しました。

最後に、このスレッドを見て、build.gradleでサポートライブラリの重複をチェックし、重複を削除しましたが、これだけでは不十分でした。

私はクリーンなプロジェクトをしなければなりませんでした、そしてそれからようやく私はそれを機能させることができました。


0

問題が解決されたことは知っていますが、これは再び発生する可能性があり、私の解決策は私が見つけたものとは少し異なっていました。私の場合、ソリューションは私のプロジェクトに2つの異なるライブラリを含めることとは関係ありませんでした。以下のコードを参照してください。

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

このコードは、「予期しないトップレベルの例外」というエラーを出していました。次の変更を加えてコードを修正します。

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

JavaバージョンはDexMergerと何の関係がありますか?
IgorGanapolsky 2017

0

これらをビルドgradleに追加することで問題を解決しました:

   defaultConfig {
   multiDexEnabled true


 dependencies {
 compile 'com.android.support:multidex:1.0.0'

別の解決策は、不要なライブラリを削除することです


なぜmultidexを有効にしたのですか?
IgorGanapolsky 2017

1
@IgorGanapolskyは、含まれている複数のライブラリの上記のような問題を解決するためです。Android Studioの場合:Dalvik Executable仕様では、Androidフレームワークメソッド、ライブラリメソッド、独自のコード内のメソッドを含め、単一のDEXファイル内で参照できるメソッドの総数が65,536に制限されています。この制限を超えるには、マルチデックス構成と呼ばれる複数のDEXファイルを生成するようにアプリビルドプロセスを構成する必要があります。
Bishnu Dudhraj 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.