web-dev-qa-db-ja.com

.dexファイル内のメソッド参照の数は64kを超えることはできませんAPI 17

私はSugarORMライブラリを使ってアプリをビルドしていますが、API 17のプロジェクトをビルドしようとすると(他の人をチェックしませんでした)、ビルドエラーが発生します。

    Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72330Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2330Library UP-TO-DATE
:app:prepareComAndroidSupportMediarouterV72300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidVolleyVolley100Library UP-TO-DATE
:app:prepareComGithubSatyanSugar14Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServices840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAds840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppindexing840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppinvite840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppstate840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesCast840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesDrive840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesFitness840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGames840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesIdentity840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesNearby840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPanorama840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPlus840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesSafetynet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesVision840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWallet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWearable840Library UP-TO-DATE
:app:prepareMeDrakeetMaterialdialogLibrary131Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:prePackageMarkerForDebug
:app:transformClassesWithDexForDebug
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.Android.com/tools/building/multidex.html
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.Android.build.api.transform.TransformException: com.Android.ide.common.process.ProcessException: Java.util.concurrent.ExecutionException: com.Android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/Java'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 21.663 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console

しかし、私がAndroid v5.0以上用にこのプロジェクトをビルドするとき、それはうまく機能します。 SugarORMのgradle依存関係を削除すれば、v4.2.2とv5.0の両方のデバイスでうまく動作します。

108

方法が多すぎます。 dexの場合は65536のメソッドしか存在できません。

お勧めのとおり、 マルチインデックスサポート を使用できます。

これらの行をbuild.gradleに追加するだけです。

Android {

    defaultConfig {
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.Android.support:multidex:1.0.0'
}

あなたのManifestにも、multidex support libraryからMultiDexApplicationクラスをapplication要素に追加してください。

    <?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">
<!--If you are using your own custom Application class then extend -->
<!--MultiDexApplication and change above line as-->
            Android:name=".YourCustomApplicationClass">

            ...
        </application>
    </manifest>

attachBaseContextメソッドをオーバーライドします。

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    MultiDex.install(this);
}

独自のApplicationクラスを使用している場合は、親クラスをApplicationからMultiDexApplicationに変更します。

別の解決策は、ProGuardを使用して未使用のコードを削除することです。 - ProGuardを実行するように ProGuard 設定を構成し、リリースビルドで縮小を有効にします。

223

Android/app/build.gradleに

Android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

これをdefaultConfigの中に入れてください。

multiDexEnabled true 

わたしにはできる

74

私のbuild.gradleファイルで私のプロジェクトの自動更新コンパイルバージョンをコーディングしている間、私はこのエラーメッセージを得ました:

Android {
    ...
    buildToolsVersion "23.0.2"
    ...
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.Android.support:appcompat-v7:23.4.0'
    compile 'com.Android.support:design:23.4.0' }

バージョンを修正して解決してください。

Android {
        ...
        buildToolsVersion "23.0.2"
        ...
    }

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.Android.support:appcompat-v7:23.0.1'
    compile 'com.Android.support:design:23.0.1'
}
18
Quan Nguyen

これは私のために働いたものです:

これは、未使用のメソッドが多すぎるために発生します。これらのメソッドのほとんどはあなたのbuild.gradleに含まれているライブラリから来ています。

リソースを縮小および縮小して、問題を解決すると同時にコードをクリーンアップします。

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            shrinkResources true
        }
    }
12
Thunderstick

このエラーは、afewのみを使用している場合にすべてのGoogle PlayサービスAPIをロードしたときにも発生する可能性があります。

Googleによると、「6.5よりも前のバージョンのGoogle Playサービスでは、APIのパッケージ全体をアプリにコンパイルする必要がありました。 65,536の制限の下でフレームワークAPI、ライブラリメソッド、および独自のコード)。

バージョン6.5からは、代わりにGoogle PlayサービスAPIを選択してアプリケーションにコンパイルすることができます。」

たとえば、アプリケーションにplay-services-maps、play-services-locationが必要な場合は、build.gradleファイルに次のように2つのAPIをアプリケーションレベルで追加するだけで済みます。

compile 'com.google.Android.gms:play-services-maps:10.2.1'
compile 'com.google.Android.gms:play-services-location:10.2.1'

の代わりに:

compile 'com.google.Android.gms:play-services:10.2.1'

完全なドキュメンテーションとグーグルプレイサービスapisのリストのためにここをクリック ここをクリック

11

私は同じ問題に直面しています、そしてマルチインデックスサポートのために、あなたはあなたのアプリケーションのminSdkVersionを覚えておかなければなりません。 minSdkVersion 21以上を使用している場合は、multiDexEnabled trueのように書くだけです。

defaultConfig {
    applicationId *******************
    minSdkVersion 21
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

それは私のために動作し、あなたが21以下のminSdkVersion(下記lolipop)を使用しているなら、あなたは2つの追加の簡単なことをしなければならない

1。最初にこの依存関係を追加する

'com.Android.support:multidex:1.0.1'をコンパイルしてください。

あなたのbuild.gradleに。

2。最後と2番目のマニフェストのアプリケーションに次の行を追加します。

Android:name = "Android.support.multidex.MultiDexApplication"

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:supportsRtl="true"
    Android:name="Android.support.multidex.MultiDexApplication"
    Android:theme="@style/AppTheme" >
    <activity Android:name=".MainActivity" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

ビンゴそれからそれはまたより低い版で働く。. :)ハッピーコーディング

6
Sudhansu

アプリの参照が65,536を超えると、アプリがAndroidビルドアーキテクチャの制限に達したことを示すビルドエラーが発生します。

Android 5.0より前のマルチデックスサポート

Android 5.0(APIレベル21)より前のバージョンのプラットフォームは、アプリコードの実行にDalvikランタイムを使用します。デフォルトでは、DalvikはアプリをAPKごとに単一のclasses.dexバイトコードファイルに制限します。この制限を回避するために、マルチデックスサポートライブラリをプロジェクトに追加することができます。

dependencies {
  implementation 'com.Android.support:multidex:1.0.3'
}

Android 5.0以降でのマルチデックスサポート

Android 5.0(APIレベル21)以降では、ARTと呼ばれるランタイムを使用します。これは、APKファイルから複数のDEXファイルをロードすることをネイティブにサポートします。したがって、minSdkVersionが21以上の場合は、マルチライブラリサポートライブラリは必要ありません。

64K制限を回避する

  • ProGuardで未使用のコードを削除する - コードの縮小を有効にする

アプリ内でマルチデックスを設定します

MinSdkVersionが21以上に設定されている場合は、モジュールレベルのbuild.gradleファイルでmultiDexEnabledをtrueに設定するだけです。

Android {
defaultConfig {
    ...
    minSdkVersion 21 
    targetSdkVersion 28
    multiDexEnabled true
  }
 ...
}

minSdkVersionが20以下に設定されている場合は、マルチデックスサポートライブラリを使用する必要があります。

Android {
defaultConfig {
    ...
    minSdkVersion 15 
    targetSdkVersion 28
    multiDexEnabled true
   }
   ...
}

dependencies {
  compile 'com.Android.support:multidex:1.0.3'
}

次のようにApplicationクラスをオーバーライドし、それをextendMultiDexApplicationに変更します(可能な場合)。

public class MyApplication extends MultiDexApplication { ... }

マニフェストファイルに追加する

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.myapp">
    <application
            Android:name="MyApplication" >
        ...
    </application>
</manifest>
2
Basi

Android 5.0より前のマルチデックスサポート

Android 5.0(APIレベル21)より前のバージョンのプラットフォームでは、アプリコードの実行にDalvikランタイムが使用されます。デフォルトでは、DalvikはアプリをAPKごとに単一のclasses.dexバイトコードファイルに制限します。この制限を回避するには、 アプリをマルチデックス用に設定する を読んでください。

Android 5.0以上のマルチデックスサポート

Android 5.0(APIレベル21)以降では、ARTと呼ばれるランタイムを使用します。これは、APKファイルから複数のDEXファイルをロードすることをネイティブにサポートします。 ARTはclassesN.dexファイルをスキャンし、それらをAndroidデバイスで実行するための単一の.oatファイルにコンパイルするアプリのインストール時にプリコンパイルを実行します。したがって、minSdkVersionが21以上の場合、マルチインデックスサポートライブラリは必要ありません。あなたがする必要があるのはあなたのモジュールレベルのbuild.gradleでmultiDexEnabledtrueに設定することだけです

詳細はこちら - https://developer.Android.com/studio/build/multidex

0
yoAlex5

これも試すことができます:

Android{
    .
    .
    // to avoid DexIndexOverflowException
    dexOptions {
       jumboMode true
    }
}

誰かに役立つことを願っています。ありがとう

0
Lazycoder_007

フラッターユーザーの場合、これはアプリレベルのbuild.gradleを使用して解決できます。

以下に変更

Android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

multiDexEnabled true

うまくいきました。

0

私の場合はGradleをアップグレードしています。 Android Webサイト で更新を確認してから、build.gradle(プロジェクト)に追加してください。

 dependencies {
        classpath 'com.Android.tools.build:gradle:2.2.0-alpha4'   
          ....
    }

それからプロジェクトをgradleファイルと同期させます、そして、それは時々Java.exeのために時々起こるかもしれません(私の場合)ちょうどウィンドウズのタスクマネージャからkill Java.exeを強制しそれからプログラムを再実行する

0
androidXP

補足説明として、multidexのサポートを追加する前に、不要な依存関係を追加していないことを確認してください。

公式のFacebook分析ガイド

次の依存関係を追加する必要があることを明確に述べています。

implementation 'com.facebook.Android:facebook-Android-sdk:[4,5)'

これは実際にはentireFacebookSDKです。したがって、たとえばアナリティクスだけが必要な場合は、次のものに置き換える必要があります。

implementation 'com.facebook.Android:facebook-core:5.+'

Facebook部分SDKオプション

0
Gal Rom