web-dev-qa-db-ja.com

.dexファイル内のメソッド参照の数が64Kを超える

プロジェクトに現在Androidアプリケーションに取り組んでいます。プロジェクトに再生サービスとFirebaseライブラリを含めた後、このエラーが発生し、コードを実行できません。

:app:prePackageMarkerForDebug:app:transformClassesWithDexForDebug dex in processを実行するには、Gradleデーモンに大きなヒープが必要です。現在、約910 MBあります。ビルドを高速化するには、Gradleデーモンの最大ヒープサイズを2048 MB以上に増やします。これを行うには、プロジェクトgradle.propertiesでorg.gradle.jvmargs = -Xmx2048Mを設定します。詳細については、 https://docs.gradle.org/current/userguide/build_environment.html エラーを参照してください。dexファイル内のメソッド参照の数は64Kを超えることはできません。 https://developer.Android.com/tools/building/multidex.html :app:transformClassesWithDexForDebug FAILED 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:プロセス 'command' /ライブラリ/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/bin/Java ''がゼロ以外の終了値2で終了しました

私のbuild.gradleファイルはここにあります:

apply plugin: 'com.Android.application'

Android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
    applicationId "xyz.in.network"
    minSdkVersion 16
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        shrinkResources true
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-Android-optimize.txt'), 'proguard-rules.pro'
        multiDexEnabled true
    }
}
}

dependencies {
   compile fileTree(dir: 'libs', include: ['*.jar'])
   testCompile 'junit:junit:4.12'
   compile project(':libs:ViewPagerIndicator')
   compile 'com.google.Android.gms:play-services:9.0.0'
   compile 'com.Android.support:appcompat-v7:23.4.0'
   compile 'com.Android.support:design:23.4.0'
   compile 'com.google.Android.gms:play-services-maps:9.0.0'
   compile 'com.google.Android.gms:play-services-location:9.0.0'
   compile 'com.Android.support:cardview-v7:23.4.0'
   compile 'com.getbase:floatingactionbutton:1.10.1'
   compile 'com.squareup.picasso:picasso:2.5.2'
   compile 'com.Android.volley:volley:1.0.0'
   compile 'com.google.firebase:firebase-messaging:9.0.0'
   compile 'com.Android.support:multidex:1.0.1'
   }

   apply plugin: 'com.google.gms.google-services'

そして私のマニフェストファイルはここにあります

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:name="Android.support.multidex.MultiDexApplication"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">
<activity Android:name=".Util.DisconnectedNetwork"
        Android:screenOrientation="portrait"
        Android:theme="@style/Theme.Transparent"></activity>

    <service Android:name=".FCM.FirebaseMessagingHandler">
        <intent-filter>
            <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>

    <service Android:name=".FCM.FirebaseRegistrationTokenHandler">
        <intent-filter>
            <action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

    <meta-data
        Android:name="com.google.Android.gms.version"
        Android:value="@integer/google_play_services_version" />

</application>

ヒープサイズを2048Mに増やした後。 Gradleはこのエラーを出します

エラー:タスク ':app:transformClassesWithDexForDebug'の実行に失敗しました。 com.Android.build.api.transform.TransformException:com.Android.ide.common.process.ProcessException:Java.util.concurrent.ExecutionException:com.Android.dex.DexIndexOverflowException:method ID not in [0、0xffff]: 65536

私はAndroidデベロッパーサイトに記載されているすべての指示に従いますが、それでもこの問題が発生します。この問題を解決するにはどうすればよいですか?

10
baldraider

Android default configでmultidexを有効にする必要があります:

Android {
    compileSdkVersion 23
    buildToolsVersion '23.0.3'

    defaultConfig {
        applicationId "com.example.case"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 43
        versionName "4.0.13"

        // Enabling multidex support.
        multiDexEnabled true
    }

日常業務でアプリケーションを構築する場合、通常はdebugデフォルトフレーバーを使用します。したがって、アプリケーションに65kを超えるメソッドがある場合は、すべてのフレーバーで有効にする必要があります。

補足として、デバッグビルドでProguardを使用すると、multiDexを有効にする必要がなくなります。

完全なapp/build.gradle( ドキュメント

Android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

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

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

最後の部分:MultiDexアプリケーションをマニフェストに追加します(または独自の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">
        ...
    </application>
</manifest>
15
Hugo Gresse

アプリで同様のエラーが発生したため、Android Studioと呼ばれるメソッドカウント( http://www.methodscount.com/ )にプラグインをインストールしました。各依存関係が使用するメソッド参照の数を示し、コンパイルパスを示しました

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

それ自身で69k以上の参照がありました

代わりに、依存関係の1つを表示するように変更しました。

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

また、このコンパイルパスの依存関係として69,520メソッド参照を示しています。

コンパイルパスの範囲を使用していない可能性が高く、使用するメソッド参照のチャンクを削除して最大65kを下回るようにするために、より集中したパスを指定できる場合があります。個別化されたサービスのリストは here です。

私の場合、Firebaseをアプリに組み込んだ約1年前にそのgmsサービス行を追加したと想像できますが、Firebase Webサイトで同じ参照を見つけることができません。

質問へのコメントを理解するだけで、依存関係を必要なものだけに分割することについて同様のことが言えます。

5
mfraser702

あなたはリリースフレーバーに対して有効なmutlidexを持っています、あなたはデバッグフレーバーのためにもこの行を持っているべきです

debug {
    multiDexEnabled true
}

release {
    shrinkResources true
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-Android-optimize.txt'), 'proguard-rules.pro'
    multiDexEnabled true
}
3
snachmsm