Jumlah referensi metode dalam file .dex tidak boleh melebihi 64k API 17

154

Saya membangun aplikasi dengan SugarORM Library tetapi ketika saya mencoba membangun proyek untuk API 17 (tidak memeriksa yang lain) itu menunjukkan kesalahan pembuatan.

    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

Tetapi ketika saya membangun proyek ini untuk Android v5.0 atau lebih tinggi, itu berfungsi dengan baik. Jika saya menghapus dependensi SugarORM gradle berfungsi dengan baik untuk kedua perangkat v4.2.2 dan v5.0.

Sandeep Singh Rana
sumber
coba gunakan proguard tautan ini android-arsenal.com/details/1/337 menetapkan penggunaan SugarORM dengan proguard
Shaan_B
19
Baru saja mendapatkan ini setelah memutakhirkan ke api 23. Tidak mungkin menjadi produktif dengan Android. Setiap SDK merusak barang. Setiap pembaruan ke AS merusak barang. Pesan kesalahan tidak dapat digunakan. SANGAT rusak. Sampah, sampah, sampah.
RunLoop
1
@RunLoop jangan kehilangan harapan .... Saya menemukan bahwa android adalah platform terbaik yang pernah dikembangkan .... Moch Fleksibel dan kuat .... Karena Anda akan mendapatkan tangan Anda kotor ke dalam pengkodean .... Ini akan baik-baik saja .... Setiap pesan kesalahan berguna. Namun perlu memahami pesan
Sandeep Singh Rana
2
@Balaj Khan One or more of the answers is exemplary and worthy of an additional bounty.Just to the point and accurate answer.Saya sarankan jawaban atas (dan diterima)!
Jon Goodwin

Jawaban:

331

Anda memiliki terlalu banyak metode. Hanya ada 65536 metode untuk dex .

Seperti yang disarankan, Anda dapat menggunakan dukungan multidex .

Cukup tambahkan baris ini di module/build.gradle:

android {

    defaultConfig {
        ...

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

dependencies {
  implementation 'com.android.support:multidex:1.0.3'  //with support libraries
  //implementation 'androidx.multidex:multidex:2.0.1'  //with androidx libraries
}

Juga di Manifest tambahkan MultiDexApplicationkelas dari pustaka dukungan multidex ke elemen aplikasi

    <?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 androidx use android:name="androidx.multidex.MultiDexApplication" -->

            <!--If you are using your own custom Application class then extend -->
            <!--MultiDexApplication and change above line as-->
            <!--android:name=".YourCustomApplicationClass"> -->

            ...
        </application>
    </manifest>

Jika Anda menggunakan Applicationkelas Anda sendiri , ubah kelas induk dari Applicationmenjadi MultiDexApplication.
Jika Anda tidak bisa melakukannya, di kelas Aplikasi Anda timpa attachBaseContextmetode dengan:

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

Solusi lain adalah mencoba untuk menghapus kode yang tidak digunakan dengan ProGuard - Konfigurasikan pengaturan ProGuard untuk aplikasi Anda untuk menjalankan ProGuard dan pastikan Anda menyusut diaktifkan untuk rilis build.

Gabriele Mariotti
sumber
1
@Override void attachBaseContext yang dilindungi (Context newBase) {super.attachBaseContext (newBase); MultiDex.install (ini); } juga mengesampingkan
Sandeep Singh Rana
1
Cmd-klik MultiDexApplication, saya melihat file .class yang sudah dikompilasi sudah melakukan persis attachBaseContext () menimpa Anda menggambarkan. Jadi tidak perlu menimpanya lagi, saya kira ..
Mete
4
Bagaimana jika saya tidak memiliki banyak metode. Saya tidak punya banyak metode di aplikasi saya. Saya percaya bahwa itu bahkan tidak mencapai itu.
Neon Warge
6
Saya hanya melakukan dua bagian ini: "multiDexEnabled true" dan mengkompilasi 'com.android.support:multidex:1.0.0', dalam file build.grandle saya. Saya tidak perlu mengubah apa pun dalam file manifes saya atau melakukan hal-hal lain yang Anda sebutkan tentang mengesampingkan attachBaseContext, dll. Tetapi solusi Anda memperbaiki masalah bagi saya! Terima kasih.
Jaime Montoya
2
@NeonWarge Mungkin karena ketergantungan Anda. Mungkin, Anda sudah memasukkan seluruh Layanan Google Play? Periksa jawaban
mr5
131

Di 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
    }

Masukkan ini ke dalam konfigurasi default Anda:

multiDexEnabled true 

ini bekerja untuk saya

Dharmendra Mishra
sumber
3
Ini hanya untuk Lollipop atau lebih tinggi, bukan?
Vic Torious
1
Itu membuat pembangunan berhasil, tetapi aplikasi macet setelah diluncurkan.
Vasanth
18

Saya mendapat pesan kesalahan ini karena ketika mengompilasi versi kompilasi pembaruan proyek saya otomatis dalam build.gradlefile saya :

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' }

Selesaikan dengan memperbaiki versi:

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'
}
Quan Nguyen
sumber
2
Saya membuat aplikasi sederhana, yang berfungsi dengan baik hingga saya mencoba mengikuti tutorial Google Map Objects. Tiba-tiba saya tidak bisa mengkompilasi lagi. Solusi ini telah memperbaiki itu untuk saya. Bagaimana Anda mengatasinya?
maccaroo
4
Metode ini untungnya berhasil karena kompilasi pustaka baru memiliki terlalu banyak metode (melebihi 65.536), dan pustaka lama tidak. Jadi itu hanya perbaikan cepat, cepat atau lambat Anda harus memperbaikinya dengan menambahkan dukungan multidex seperti jawaban yang diterima.
Quan Nguyen
15

Inilah yang bekerja untuk saya:

Ini terjadi karena ada terlalu banyak metode yang tidak digunakan. Sebagian besar metode ini berasal dari perpustakaan yang disertakan dalam build.gradle Anda

Gunakan sumber daya minify dan shrink untuk memperbaikinya dengan gradle dan bersihkan kode Anda secara bersamaan.

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

Ubah build.gradle tingkat aplikasi:

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

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

itu berhasil untuk saya.

shivan dan naduvin
sumber
ya, ini adalah masalah lama, tetapi untuk versi API terakhir kami hanya perlu multiDexEnabledopsi, tanpa ketergantungan atau perubahan file nyata
Hpsaturn
11

Kesalahan ini juga dapat terjadi ketika Anda memuat semua layanan google play apis saat Anda hanya menggunakan sedikit.

Seperti yang dinyatakan oleh google: "Dalam versi layanan Google Play sebelum 6.5, Anda harus mengkompilasi seluruh paket API ke dalam aplikasi Anda. Dalam beberapa kasus, hal itu membuatnya lebih sulit untuk mempertahankan jumlah metode dalam aplikasi Anda (termasuk API kerangka kerja, metode pustaka, dan kode Anda sendiri) di bawah batas 65.536.

Dari versi 6.5, Anda dapat mengkompilasi API layanan Google Play secara selektif ke dalam aplikasi Anda. "

Misalnya ketika aplikasi Anda membutuhkan play-services-maps, play-services-location. Anda hanya perlu menambahkan dua apis di file build.gradle Anda di tingkat aplikasi seperti yang ditunjukkan di bawah ini:

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

Dari pada:

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

Untuk dokumentasi lengkap dan daftar layanan google play apis klik di sini

James Kuta Simiyu
sumber
9

Ketika referensi aplikasi Anda melebihi 65.536 metode, Anda menemukan kesalahan build yang menunjukkan aplikasi Anda telah mencapai batas arsitektur Android build

Dukungan multidex sebelum Android 5.0

Versi platform sebelum Android 5.0 (API level 21) menggunakan runtime Dalvik untuk mengeksekusi kode aplikasi. Secara default, Dalvik membatasi aplikasi ke file bytecode class.dex tunggal per APK. Untuk mengatasi batasan ini, Anda dapat menambahkan pustaka dukungan multidex ke proyek Anda:

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

Dukungan multidex untuk Android 5.0 dan lebih tinggi

Android 5.0 (API level 21) dan lebih tinggi menggunakan runtime yang disebut ART yang secara alami mendukung memuat beberapa file DEX dari file APK. Oleh karena itu, jika minSdkVersion Anda 21 atau lebih tinggi, Anda tidak perlu multidex dukungan .

Hindari batas 64K

  • Hapus kode yang tidak digunakan dengan ProGuard - Mengaktifkan penyusutan kode

Konfigurasikan multidex di aplikasi untuk

Jika minSdkVersion Anda diatur ke 21 atau lebih tinggi, yang perlu Anda lakukan adalah mengatur multiDexEnabled menjadi true dalam file build.gradle tingkat modul Anda.

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

jika minSdkVersion Anda diatur ke 20 atau lebih rendah, maka Anda harus menggunakan pustaka dukungan multidex

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

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

Ganti kelas Aplikasi, ubah untuk memperluas MultiDexApplication (jika mungkin) sebagai berikut:

public class MyApplication extends MultiDexApplication { ... }

tambahkan ke file manifes

<?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>
Basi
sumber
8

Saya telah menghadapi masalah yang sama dan untuk dukungan multidex, Anda harus mengingat minSdkVersion aplikasi Anda. Jika Anda menggunakan minSdkVersion 21 atau lebih baru, tulis saja multiDexEnabled benar seperti ini

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

Ini berfungsi untuk saya dan jika Anda menggunakan minSdkVersion di bawah 21 (di bawah lolipop ) maka Anda harus melakukan dua hal ekstra sederhana

1. Pertama tambahkan ketergantungan ini

kompilasi 'com.android.support:multidex:1.0.1'

di build.gradle Anda.

2. Terakhir dan kedua tambahkan satu baris di bawah ini ke aplikasi Anda dalam manifes

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>

Bingo maka itu akan bekerja di versi yang lebih rendah juga .. :) Selamat coding

Sudhansu
sumber
1

Hanya komentar sampingan, Sebelum menambahkan dukungan untuk multidex - pastikan Anda tidak menambahkan dependensi yang tidak perlu.

Misalnya dalam panduan analisis Facebook resmi

Mereka dengan jelas menyatakan bahwa Anda harus menambahkan ketergantungan berikut:

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

yang sebenarnya adalah seluruh FacebookSDK - jadi jika Anda hanya perlu misalnya Analytics, Anda harus menggantinya dengan:

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

Opsi SDK parsial Facebook

Gal Rom
sumber
Setuju. Dalam kasus saya misalnya, saya hanya perlu tombol "login dengan facebook" dan menggunakan seluruh facebook SDK. Saya telah menggantinya dengan facebook-coredan facebook-loginkesalahan telah hilang.
cleybertandre
0

Bagi saya Upgrade Gradle berfungsi. Cari pembaruan di Situs Web Android, lalu tambahkan di build.gradle Anda (Proyek) seperti ini

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

kemudian sinkronkan proyek dengan file gradle plus itu mungkin terjadi kadang-kadang karena java.exe (dalam kasus saya) hanya memaksa membunuh java.exe dari task manager di windows kemudian jalankan kembali program

androidXP
sumber
0

Bisa juga coba ini:

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

Semoga ini bisa membantu seseorang. Terima kasih

Lazycoder_007
sumber
0

**

Untuk Pengembang Game Unity

**

Jika ada yang datang ke sini karena kesalahan ini muncul di proyek Unity mereka, Buka File-> Build Settings -> Pengaturan Player -> Player. pergi ke Pengaturan Penerbitan dan di bawah tab Bangun, aktifkan "Kustom Template Gradle Peluncur". jalan akan ditampilkan di bawah teks itu. buka jalan dan tambahkan multiDexEnabled true seperti ini:

defaultConfig {
    minSdkVersion **MINSDKVERSION**
    targetSdkVersion **TARGETSDKVERSION**
    applicationId '**APPLICATIONID**'
    ndk {
        abiFilters **ABIFILTERS**
    }
    versionCode **VERSIONCODE**
    versionName '**VERSIONNAME**'
    multiDexEnabled true
}
Mungkin Tuan
sumber
-1

Anda dapat mengaktifkan "Instant Run" di Android Studio untuk mendapatkan dukungan multidex.

Quang Vĩnh Ha
sumber
-2

Lakukan ini, ini berfungsi:

defaultConfig {
    applicationId "com.example.maps"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}
tejasri
sumber
2
Tolong jelaskan jawaban Anda. Jawaban hanya kode tidak disarankan pada SO. Terima kasih.
Gennadii Saprykin